Announcement

Collapse
No announcement yet.

GDI+ and IUnknown-IStream interface

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Patrice Terrier
    replied
    Merci José.


    ------------------
    Patrice Terrier
    mailto[email protected][email protected]</A>
    www.zapsolution.com
    Addons: WinLIFT (Skin Engine), GDI+ helper (Graphic package), Artwork (logo creation)

    Leave a comment:


  • José Roca
    replied
    I was going to send you the PB example when I have noticed your post
    Code:
    %GMEM_MOVEABLE       = &H2
    %GMEM_NODISCARD      = &H20
    
    TYPE GdiplusStartupInput
       GdiplusVersion AS LONG             ' Must be 1
       DebugEventCallback AS LONG         ' Ignored on free builds
       SuppressBackgroundThread AS LONG   ' FALSE unless you're prepared to call
                                          ' the hook/unhook functions properly
       SuppressExternalCodecs AS LONG     ' FALSE unless you want GDI+ only to use
                                          ' its internal image codecs.
    END TYPE
    
    DECLARE SUB MoveMemory LIB "KERNEL32.DLL" ALIAS "RtlMoveMemory" (pDestination AS ANY, pSource AS ANY, BYVAL cbLength AS LONG)
    SUB CopyMemory (BYVAL pDestination AS DWORD, BYVAL pSource AS DWORD, BYVAL cbLength AS LONG)
      MoveMemory BYVAL pDestination, BYVAL pSource, cbLength
    END SUB
    
    DECLARE FUNCTION GlobalAlloc LIB "KERNEL32.DLL" ALIAS "GlobalAlloc" (BYVAL wFlags AS DWORD, BYVAL dwBytes AS DWORD) AS LONG
    DECLARE FUNCTION GlobalFree LIB "KERNEL32.DLL" ALIAS "GlobalFree" (BYVAL hMem AS DWORD) AS LONG
    DECLARE FUNCTION GlobalLock LIB "KERNEL32.DLL" ALIAS "GlobalLock" (BYVAL hMem AS DWORD) AS DWORD
    DECLARE FUNCTION GlobalUnlock LIB "KERNEL32.DLL" ALIAS "GlobalUnlock" (BYVAL hMem AS DWORD) AS LONG
    
    DECLARE FUNCTION GdipCreateBitmapFromStream LIB "gdiplus.dll" ALIAS "GdipCreateBitmapFromStream" (Byval pstream as Dword, nBitmap As Long) AS LONG
    
    DECLARE FUNCTION GdiplusStartup LIB "gdiplus.dll" ALIAS "GdiplusStartup" (token&, inputbuf AS GdiplusStartupInput, OPTIONAL BYVAL outputbuf&) AS LONG
    DECLARE FUNCTION GdiplusShutdown LIB "gdiplus.dll" ALIAS "GdiplusShutdown" (BYVAL token&) AS LONG
    DECLARE FUNCTION GdipLoadImageFromStream LIB "gdiplus.dll" ALIAS "GdipLoadImageFromStream" (BYVAL stream AS DWORD, nImage&) AS LONG
    DECLARE FUNCTION CreateStreamOnHGlobal LIB "ole32.dll" ALIAS "CreateStreamOnHGlobal" (BYVAL hGlobal AS DWORD, BYVAL fDeleteOnRelease AS DWORD, pstm AS DWORD) AS LONG
    
    FUNCTION GdipStart() EXPORT AS LONG
        DIM GpInput AS GdiplusStartupInput
        GpInput.GdiplusVersion = 1
        IF GdiplusStartup(hGDIplus&, GpInput) = 0 THEN FUNCTION = hGDIplus&
    END FUNCTION
    
    SUB GdipEnd(BYVAL hGDIplus&)
        IF hGDIplus& THEN CALL GdiplusShutdown(hGDIplus&): hGDIplus& = 0
    END SUB
    
    FUNCTION IUnknown_Release (BYVAL pthis AS DWORD PTR) AS DWORD
        LOCAL DWRESULT AS DWORD
        IF pthis THEN
           CALL DWORD @@pthis[2] USING IUnknown_Release(pthis) TO DWRESULT
           FUNCTION = DWRESULT
        END IF
    END FUNCTION
    
    FUNCTION PBMAIN()
    
        DIM iImageStream AS DWORD, hImage AS LONG, hGDIplus AS LONG
    
        DIM imageSize AS LONG, sBuffer AS STRING, hGlobal AS DWORD, pGlobalBuffer AS DWORD
    
        hGDIplus = GdipStart
    
        sFilename$ = "genus.jpg"
        hFile& = FreeFile
        Open sFilename$ For Binary Access Read Shared As #hFile&
        imageSize = LOF(hFile&)
        sBuffer = SPACE$(imageSize)
        Get #hFile&, , sBuffer
        Close #hFile&
    
    
        hGlobal = GlobalAlloc(%GMEM_MOVEABLE OR %GMEM_NODISCARD, imageSize)
        IF hGlobal THEN
           pGlobalBuffer = GlobalLock(hGlobal)
           IF pGlobalBuffer THEN
              CopyMemory pGlobalBuffer, STRPTR(sBuffer), imageSize
              IF CreateStreamOnHGlobal(hGlobal, BYVAL 0&, iImageStream) = 0 THEN
                 Ret& = GdipCreateBitmapFromStream(iImageStream, hImage)
                 IF Ret& THEN
                    MSGBOX "Couldn't Load Image" + str$(Ret&) ' %GpStatusInvalidParameter = 2
                 ELSE
                    MSGBOX "It's good"
                 END IF
                 CALL IUnknown_Release(iImageStream)
              END IF
              GlobalUnlock pGlobalBuffer
           END IF
           GlobalFree hGlobal
        END IF
    
        CALL GdipEnd(hGDIplus)
    
    END FUNCTION

    ------------------
    Website: http://com.it-berater.org
    SED Editor, TypeLib Browser, Wrappers for ADO, DAO, ODBC, CDOEX, MSXML, WMI, MSAGENT, Flash Player, Task Scheduler, Accesibility, Structured Storage, WinHTTP, Microsoft ActiveX Controls (Data Binding, ADODC, Flex Grid, Hierarchical Flex Grid, Masked Edit Control, DataList, DataCombo, MAPI, INET, MCI, Winsock, Common Dialog, MSChart, Outlook View Control), and Microsoft Scripting Components.

    [This message has been edited by José Roca (edited November 23, 2005).]

    Leave a comment:


  • Patrice Terrier
    started a topic GDI+ and IUnknown-IStream interface

    GDI+ and IUnknown-IStream interface

    I am unable to use the GdipLoadImageFromStream,
    the function always fails because of invalid parameter in the
    IStream interface (I have never been comfortable with COM)

    Code:
    TYPE GdiplusStartupInput
       GdiplusVersion AS LONG             ' Must be 1
       DebugEventCallback AS LONG         ' Ignored on free builds
       SuppressBackgroundThread AS LONG   ' FALSE unless you're prepared to call
                                          ' the hook/unhook functions properly
       SuppressExternalCodecs AS LONG     ' FALSE unless you want GDI+ only to use
                                          ' its internal image codecs.
    END TYPE
    
    DECLARE FUNCTION GdiplusStartup LIB "gdiplus.dll" ALIAS "GdiplusStartup" (token&, inputbuf AS GdiplusStartupInput, OPTIONAL BYVAL outputbuf&) AS LONG
    DECLARE FUNCTION GdiplusShutdown LIB "gdiplus.dll" ALIAS "GdiplusShutdown" (BYVAL token&) AS LONG
    DECLARE FUNCTION GdipLoadImageFromStream LIB "gdiplus.dll" ALIAS "GdipLoadImageFromStream" (BYVAL stream AS DWORD, nImage&) AS LONG
    DECLARE FUNCTION CreateStreamOnHGlobal LIB "ole32.dll" ALIAS "CreateStreamOnHGlobal" (BYVAL hGlobal AS DWORD, BYVAL fDeleteOnRelease AS DWORD, pstm AS DWORD) AS LONG
    
    FUNCTION GdipStart() EXPORT AS LONG
        DIM GpInput AS GdiplusStartupInput
        GpInput.GdiplusVersion = 1
        IF GdiplusStartup(hGDIplus&, GpInput) = 0 THEN FUNCTION = hGDIplus&
    END FUNCTION
    
    SUB GdipEnd(BYVAL hGDIplus&)
        IF hGDIplus& THEN CALL GdiplusShutdown(hGDIplus&): hGDIplus& = 0
    END SUB
    
    FUNCTION IUnknown_Release (BYVAL pthis AS DWORD PTR) AS DWORD
        LOCAL DWRESULT AS DWORD
        IF pthis THEN
           CALL DWORD @@pthis[2] USING IUnknown_Release(pthis) TO DWRESULT
           FUNCTION = DWRESULT
        END IF
    END FUNCTION
    
    FUNCTION PBMAIN()
        DIM IStream AS DWORD
        DIM hImage AS LONG, hGDIplus AS LONG
    
        hGDIplus = GdipStart
              
        sFilename$ = "genus.jpg"
        hFile& = FreeFile
        Open sFilename$ For Binary Access Read Shared As #hFile&
        ReDim m_ImageData(0 To LOF(hFile&) - 1) AS BYTE
        Get #hFile&, , m_ImageData(0)
        Close #hFile&
        If CreateStreamOnHGlobal(m_ImageData(0), BYVAL 0&, IStream) = 0 Then
            Ret& = GdipLoadImageFromStream([b]IStream[/b], hImage)
            IF Ret& Then
                MSGBOX "Couldn't Load Image" + str$(Ret&) ' %GpStatusInvalidParameter = 2 
            else
                MSGBOX "It's good"
            End If
            CALL IUnknown_Release(IStream)
        End If
        CALL GdipEnd(hGDIplus)
    
    END FUNCTION

    ------------------
    Patrice Terrier
    mailto[email protected][email protected]</A>
    www.zapsolution.com
    Addons: WinLIFT (Skin Engine), GDI+ helper (Graphic package), Artwork (logo creation)
Working...
X