Hubdog 能看看吗?!IShellPropSheetExt的问题。(100分)

  • 主题发起人 主题发起人 小笨象
  • 开始时间 开始时间

小笨象

Unregistered / Unconfirmed
GUEST, unregistred user!
// IShellPropSheetExt
HRESULT __stdcall TDCBKShellExtInfoImpl::AddPages( LPFNADDPROPSHEETPAGE lpfnAddPageProc,
LPARAM lParam )
{
PROPSHEETPAGE psp;
HPROPSHEETPAGE hPage;
// Set up the PROPSHEETPAGE struct.

ZeroMemory ( &psp, sizeof(PROPSHEETPAGE) );
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags =PSP_USEREFPARENT | PSP_USETITLE | PSP_DEFAULT |
PSP_USEICONID | PSP_USECALLBACK;
psp.hInstance = _Module.GetModuleInstance();
psp.pszTemplate = MAKEINTRESOURCE("IDD_SHELLEXT");
psp.pszIcon = NULL
psp.pszTitle = "测试用的";
psp.pfnDlgProc = PropPageDlgProc;//这里出错了。
psp.lParam = NULL;
psp.pfnCallback = PropPageCallbackProc;
psp.pcRefParent = (UINT*) &_Module.m_nLockCnt;

}

标明的地方的定义是:
BOOL CALLBACK PropPageDlgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
在MSDN中也是这样的定义。
可是编译时就总是说不对,参数不匹配!
[C++ Error] DCBKShellExtInfoImpl.cpp(212): E2034 Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
可是为何啊?!难道CB还重新定义了该结构?
知道是怎么回事吗?帮忙看看。
谢谢了!
 
The pfnDlgProc member should be set to the address of this procedure.
也就是说,这个成员应该是 PropPageDlgProc 的地址指针。
 
在VC里,也是这样做的,在MSDN里也是这样做的。
相当于指针赋值。
 
是吗?
psp.pfnDlgProc = PropPageDlgProc;
是指针赋值?
好象是把 PropPageDlgProc() 的返回值赋给了 psp.pfnDlgProc 吧。
如果是 Delphi ,这句应该写作:
psp.pfnDlgProc = @PropPageDlgProc;
C 的话,你可以写成下面形式试试:
psp.pfnDlgProc = &PropPageDlgProc;
 
不是,在C++这个地方,是把psp.pfnDlgProc 这个函数重定向(这样说好象不对)为PropPageDlgProc
也就是用PropPageDlgProc这个函数来处理。
 
不行。&那样只是取地址。
 
请看看这个文章,我就是从那里改成CB的,可是就是不 行。
http://dby.csdn.net/Dby/Articles/Vc1/shell/shellextguide5.asp
 
你的PropPageDlgProc函数在哪里定义的?参数错了。你应该先定义PropPageDlgProc函数,这是回调函数。
int __stdcall PropPageDlgProc(void *,unsigned int,unsigned int,long)
{
...
}
 
是啊!
我已经在前面声明并实现了。
BOOL CALLBACK MyPropPageDlgProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK MyPropPageDlgProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
BOOL bRet = FALSE;

switch ( uMsg )
{
case WM_INITDIALOG:
bRet = OnInitDialog ( hwnd, lParam );
break;

case WM_NOTIFY:
{
NMHDR* phdr = (NMHDR*) lParam;

switch ( phdr->code )
{
case DTN_DATETIMECHANGE:
SendMessage ( GetParent(hwnd), PSM_CHANGED, (WPARAM) hwnd, 0 );
break;
}
}
break;
}

return bRet;
}
 
DCBKShellExtInfoImpl.cpp(212),这一行的内容是什么?
 
我在前面加上:(DLGPROC)就行了!做了一次强制转换!
 
谢谢小雨哥了。
 
后退
顶部