user-0 提问: 关于纯C语言+API显示jpg图片的问题

回复:
user: user-1
content: 引用 4 楼 qq_18599547 的回复:[quote=引用 3 楼 adlay 的回复:] [quote=引用 2 楼 qq_18599547 的回复:] [quote=引用 1 楼 adlay 的回复:] ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法， 在 C 里面的话， 你得这样写了： ppic->lpVtbl->get_Width(ppic, &hmWidth);  然而我并没有发现有 lpVtbl 这个命令 - - ppic-> 直接是get_Width()[/quote] 你得看定义的 C 接口部分啊，别去看 C++ 的  ocidl.h 的 4297 行 （VC2005）：       interface IPicture     {         CONST_VTBL struct IPictureVtbl *lpVtbl;     };   其中 IPictureVtabl 的定义就在这个接口定义的前面  根据后面定义的几个宏来看，可以用这个宏来简化：  IPicture_get_Width(ppic,  &hmWidth);  宏展开后和 ppic->lpVtbl->get_Width(ppic, &hmWidth); 是等价的[/quote] 表示看不懂 我用的VC6.0         typedef struct IPictureVtbl     {         BEGIN_INTERFACE                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(              IPicture __RPC_FAR * This,             /* [in] */ REFIID riid,             /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);                  ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(              IPicture __RPC_FAR * This);                  ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(              IPicture __RPC_FAR * This);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Handle )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_HANDLE __RPC_FAR *pHandle);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_hPal )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_HANDLE __RPC_FAR *phPal);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Type )(              IPicture __RPC_FAR * This,             /* [out] */ SHORT __RPC_FAR *pType);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Width )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_XSIZE_HIMETRIC __RPC_FAR *pWidth);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Height )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_YSIZE_HIMETRIC __RPC_FAR *pHeight);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Render )(              IPicture __RPC_FAR * This,             /* [in] */ HDC hDC,             /* [in] */ LONG x,             /* [in] */ LONG y,             /* [in] */ LONG cx,             /* [in] */ LONG cy,             /* [in] */ OLE_XPOS_HIMETRIC xSrc,             /* [in] */ OLE_YPOS_HIMETRIC ySrc,             /* [in] */ OLE_XSIZE_HIMETRIC cxSrc,             /* [in] */ OLE_YSIZE_HIMETRIC cySrc,             /* [in] */ LPCRECT pRcWBounds);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *set_hPal )(              IPicture __RPC_FAR * This,             /* [in] */ OLE_HANDLE hPal);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_CurDC )(              IPicture __RPC_FAR * This,             /* [out] */ HDC __RPC_FAR *phDC);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SelectPicture )(              IPicture __RPC_FAR * This,             /* [in] */ HDC hDCIn,             /* [out] */ HDC __RPC_FAR *phDCOut,             /* [out] */ OLE_HANDLE __RPC_FAR *phBmpOut);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_KeepOriginalFormat )(              IPicture __RPC_FAR * This,             /* [out] */ BOOL __RPC_FAR *pKeep);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_KeepOriginalFormat )(              IPicture __RPC_FAR * This,             /* [in] */ BOOL keep);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PictureChanged )(              IPicture __RPC_FAR * This);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SaveAsFile )(              IPicture __RPC_FAR * This,             /* [in] */ LPSTREAM pStream,             /* [in] */ BOOL fSaveMemCopy,             /* [out] */ LONG __RPC_FAR *pCbSize);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Attributes )(              IPicture __RPC_FAR * This,             /* [out] */ DWORD __RPC_FAR *pDwAttr);                  END_INTERFACE     } IPictureVtbl;      interface IPicture     {         CONST_VTBL struct IPictureVtbl __RPC_FAR *lpVtbl;     }; [/quote]  在看不懂的宏上跳转到定义去看下这些宏定义就懂了 C 语言的结构体没有成员函数一说，所以这里面都是放的函数指针，函数指针的语法本来也较难。  你先按照我给你说的改就行了。

user: user-0
content: 引用 3 楼 adlay 的回复:[quote=引用 2 楼 qq_18599547 的回复:] [quote=引用 1 楼 adlay 的回复:] ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法， 在 C 里面的话， 你得这样写了： ppic->lpVtbl->get_Width(ppic, &hmWidth);  然而我并没有发现有 lpVtbl 这个命令 - - ppic-> 直接是get_Width()[/quote] 你得看定义的 C 接口部分啊，别去看 C++ 的  ocidl.h 的 4297 行 （VC2005）：       interface IPicture     {         CONST_VTBL struct IPictureVtbl *lpVtbl;     };   其中 IPictureVtabl 的定义就在这个接口定义的前面  根据后面定义的几个宏来看，可以用这个宏来简化：  IPicture_get_Width(ppic,  &hmWidth);  宏展开后和 ppic->lpVtbl->get_Width(ppic, &hmWidth); 是等价的[/quote] 表示看不懂 我用的VC6.0         typedef struct IPictureVtbl     {         BEGIN_INTERFACE                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(              IPicture __RPC_FAR * This,             /* [in] */ REFIID riid,             /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);                  ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(              IPicture __RPC_FAR * This);                  ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(              IPicture __RPC_FAR * This);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Handle )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_HANDLE __RPC_FAR *pHandle);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_hPal )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_HANDLE __RPC_FAR *phPal);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Type )(              IPicture __RPC_FAR * This,             /* [out] */ SHORT __RPC_FAR *pType);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Width )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_XSIZE_HIMETRIC __RPC_FAR *pWidth);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Height )(              IPicture __RPC_FAR * This,             /* [out] */ OLE_YSIZE_HIMETRIC __RPC_FAR *pHeight);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Render )(              IPicture __RPC_FAR * This,             /* [in] */ HDC hDC,             /* [in] */ LONG x,             /* [in] */ LONG y,             /* [in] */ LONG cx,             /* [in] */ LONG cy,             /* [in] */ OLE_XPOS_HIMETRIC xSrc,             /* [in] */ OLE_YPOS_HIMETRIC ySrc,             /* [in] */ OLE_XSIZE_HIMETRIC cxSrc,             /* [in] */ OLE_YSIZE_HIMETRIC cySrc,             /* [in] */ LPCRECT pRcWBounds);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *set_hPal )(              IPicture __RPC_FAR * This,             /* [in] */ OLE_HANDLE hPal);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_CurDC )(              IPicture __RPC_FAR * This,             /* [out] */ HDC __RPC_FAR *phDC);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SelectPicture )(              IPicture __RPC_FAR * This,             /* [in] */ HDC hDCIn,             /* [out] */ HDC __RPC_FAR *phDCOut,             /* [out] */ OLE_HANDLE __RPC_FAR *phBmpOut);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_KeepOriginalFormat )(              IPicture __RPC_FAR * This,             /* [out] */ BOOL __RPC_FAR *pKeep);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_KeepOriginalFormat )(              IPicture __RPC_FAR * This,             /* [in] */ BOOL keep);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *PictureChanged )(              IPicture __RPC_FAR * This);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *SaveAsFile )(              IPicture __RPC_FAR * This,             /* [in] */ LPSTREAM pStream,             /* [in] */ BOOL fSaveMemCopy,             /* [out] */ LONG __RPC_FAR *pCbSize);                  HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Attributes )(              IPicture __RPC_FAR * This,             /* [out] */ DWORD __RPC_FAR *pDwAttr);                  END_INTERFACE     } IPictureVtbl;      interface IPicture     {         CONST_VTBL struct IPictureVtbl __RPC_FAR *lpVtbl;     };

user: user-1
content: 引用 2 楼 qq_18599547 的回复:[quote=引用 1 楼 adlay 的回复:] ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法， 在 C 里面的话， 你得这样写了： ppic->lpVtbl->get_Width(ppic, &hmWidth);  然而我并没有发现有 lpVtbl 这个命令 - - ppic-> 直接是get_Width()[/quote] 你得看定义的 C 接口部分啊，别去看 C++ 的  ocidl.h 的 4297 行 （VC2005）：       interface IPicture     {         CONST_VTBL struct IPictureVtbl *lpVtbl;     };   其中 IPictureVtabl 的定义就在这个接口定义的前面  根据后面定义的几个宏来看，可以用这个宏来简化：  IPicture_get_Width(ppic,  &hmWidth);  宏展开后和 ppic->lpVtbl->get_Width(ppic, &hmWidth); 是等价的

user: user-0
content: 引用 1 楼 adlay 的回复:ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法， 在 C 里面的话， 你得这样写了： ppic->lpVtbl->get_Width(ppic, &hmWidth);  然而我并没有发现有 lpVtbl 这个命令 - - ppic-> 直接是get_Width()

user: user-1
content: ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法， 在 C 里面的话， 你得这样写了： ppic->lpVtbl->get_Width(ppic, &hmWidth);