将对象的指针作为参数传递给DialogBoxParam()

时间:2013-04-08 14:57:04

标签: c++ winapi win32gui

我想将对象的指针作为DialogBoxParam()的第五个参数传递。

INT_PTR WINAPI DialogBoxParam(
  _In_opt_  HINSTANCE hInstance,
  _In_      LPCTSTR lpTemplateName,
  _In_opt_  HWND hWndParent,
  _In_opt_  DLGPROC lpDialogFunc,
  _In_      LPARAM dwInitParam
);


以下是我对DialogBoxParam()的致电:

MyClass *myObject = new MyClass();
DialogBoxParam(
    GetModuleHandle(NULL),
    MAKEINTRESOURCE(IDD_SELECT_ETC),
    hwnd,
    CallbackDlgProc,
    (LPARAM)&myObject
);

以下是CallbackDlgProc()中的一次尝试(知道myFile是myObject的公共字符*成员):

BOOL CALLBACK CallbackDlgProc(HWND hwndDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
    switch(Message)
    {
        case WM_INITDIALOG:
        {
            MessageBox(NULL, (CHAR*)((*(MyClass*)lParam).myFile), "Title", MB_OK);
            return TRUE;
        }
        case [...]
    }
}


知道如何从myObject访问和修改CallbackDlgProc()吗?

2 个答案:

答案 0 :(得分:4)

当您将其传递给DialogBoxParam时,您使用地址运算符&来获取指针。但是,它已经是一个指针,因此您实际上将指针传递给指针(类型MyClass**)。

调整回调函数中的代码,或者不使用address-of运算符。

答案 1 :(得分:0)

对于不理解上述答案的人的更详细解释,在OP的示例代码中,您必须删除"&"使它工作:

DialogBoxParam(
    GetModuleHandle(NULL),
    MAKEINTRESOURCE(IDD_SELECT_ETC),
    hwnd,
    CallbackDlgProc,
    (LPARAM)myObject
);

享受。