【问题标题】:Pass object's pointer as parameter to DialogBoxParam()将对象的指针作为参数传递给 DialogBoxParam()
【发布时间】:2013-04-08 14:57:03
【问题描述】:

我想将对象的指针作为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 的公共 char* 成员):

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 [...]
    }
}


知道如何从CallbackDlgProc() 访问和编辑myObject 吗?

【问题讨论】:

    标签: c++ winapi win32gui


    【解决方案1】:

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

    要么调整你的回调函数中的代码,要么不使用地址操作符。

    【讨论】:

    • 那很快,谢谢幸运的卢克。来自前延雪平先生的问候;)
    【解决方案2】:

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

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

    享受吧。

    【讨论】:

      猜你喜欢
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多