关于纯C语言+API显示jpg图片的问题

qq_18599547 2015-09-21 10:57:32

#include <windows.h>

#include <ocidl.h>

#include <olectl.h>

#include <Shlwapi.h>

int SetWindowsBGI ( HWND hwnd, char *ImagePath )

{
HDC DC = GetDC(hwnd);

HANDLE FHD = CreateFile ("C:\\Users\\Administrator\\Desktop\\图形界面资源\\bak.jpg", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );//打开文件

unsigned long dwFileSize = GetFileSize ( FHD, NULL );//获取图片文件大小

HGLOBAL ImageMemary = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);//分配全局内存

LPVOID MemaryLock = GlobalLock ( ImageMemary );//锁内存

unsigned long ActualSize = 0;//用来保存实际大小

IPicture *ppic;

IStream *pstm;

OLE_XSIZE_HIMETRIC hmWidth = 0;

OLE_YSIZE_HIMETRIC hmHeight = 0;

ReadFile ( FHD, MemaryLock, dwFileSize, &ActualSize, NULL);//读入图片数据到内存中

GlobalUnlock ( ImageMemary );//解锁内存

CloseHandle ( FHD );//关闭文件句柄

CreateStreamOnHGlobal (ImageMemary, 0, &pstm);

OleLoadPicture(pstm,dwFileSize,1,&IID_IPicture,(LPVOID*)&ppic);

ppic->get_Width ( &hmWidth );

//ppic->Render(DC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL);

//GlobalFree(ImageMemary);*/

return 0;

}

为什么调用接口指针方法时报错呢?
错误提示:
E:\c\LockScreen\yuan.c(326) : error C2039: 'get_Width' : is not a member of 'IPicture'
c:\program files (x86)\microsoft visual studio\vc98\include\ocidl.h(4412) : see declaration of 'IPicture'
执行 cl.exe 时出错.
不知道怎么解决了....
...全文
401 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2015-09-22
  • 打赏
  • 举报
回复
引用 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 语言的结构体没有成员函数一说,所以这里面都是放的函数指针,函数指针的语法本来也较难。 你先按照我给你说的改就行了。
qq_18599547 2015-09-22
  • 打赏
  • 举报
回复
引用 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;
    };
www_adintr_com 2015-09-21
  • 打赏
  • 举报
回复
引用 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); 是等价的
qq_18599547 2015-09-21
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法, 在 C 里面的话, 你得这样写了: ppic->lpVtbl->get_Width(ppic, &hmWidth);
然而我并没有发现有 lpVtbl 这个命令 - - ppic-> 直接是get_Width()
www_adintr_com 2015-09-21
  • 打赏
  • 举报
回复
ppic->get_Width ( &hmWidth ); 是 C++ 里面的写法, 在 C 里面的话, 你得这样写了: ppic->lpVtbl->get_Width(ppic, &hmWidth);

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧