Winapi DialogProc函数要求声明它为自静态

Winapi DialogProc函数要求声明它为自静态,winapi,c++11,dialog,static-methods,static-members,Winapi,C++11,Dialog,Static Methods,Static Members,这是我的createdialogparam函数,它从这里调用DialogProc函数- HRESULT AMEPreviewHandler::CreatePreviewWindow() { assert(m_hwndPreview == NULL); assert(m_hwndParent != NULL); HRESULT hr = S_OK; m_hwndPreview = CreateDialogParam( g_

这是我的createdialogparam函数,它从这里调用DialogProc函数-

 HRESULT AMEPreviewHandler::CreatePreviewWindow()
    {
        assert(m_hwndPreview == NULL);
        assert(m_hwndParent != NULL);
        HRESULT hr = S_OK;

        m_hwndPreview = CreateDialogParam( g_hInst,MAKEINTRESOURCE(IDD_MAINDIALOG), m_hwndParent,(DLGPROC)DialogProc, (LPARAM)this); /here the dialog proc function is called
        if (m_hwndPreview == NULL)
        {
          hr = HRESULT_FROM_WIN32(GetLastError());
        }
    ..........
    ...
    }
下面是DialogProc函数的定义-

BOOL CALLBACK AMEPreviewHandler::DialogProc(HWND m_hwndPreview, UINT Umsg, WPARAM wParam, LPARAM lParam) 
    { 
        static RECT m_rcParent ;

        switch(Umsg)
        {
        case WM_INITDIALOG: 
            {
            return 0;
            }
            break;
........
case WM_COMMAND:
            {  
                int ctl = LOWORD(wParam);
                int event = HIWORD(wParam);

                if (ctl == IDC_PREVIOUS && event == BN_CLICKED ) 
                {         

                    CreateHtmlPreview(); //it must be static now and it is not able to access the non static vraibles delared globally in the program
                    return 0;
                }     
}
}
声明是这样的-

静态BOOL回调对话框proc(HWND-hWindow、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM)//假设它是静态的。如果它是静态的,则不会给出任何错误。如果它不是声明为静态的,则会给出错误
这里-

有没有办法访问静态DialogProc中全局声明的变量,或者可以访问DialogProc中全局声明的变量,而不将这些变量声明为静态变量,因为它们在程序的其他部分也用作非静态变量???

如果

静态对话框proc中全局声明的变量

您是指
AMEPreviewHandler
实例中的成员变量,我认为您已经在LPRAM中发送了所需的内容:

m_hwndPreview = CreateDialogParam( ...(LPARAM)this);
当它调用对话框proc时,这些参数转到最后一个参数:
LPARAM LPARAM
,这样您就可以执行以下操作了

AMEPreviewHandler* instance = (AMEPreviewHandler *)lParam;
instance->m_Whatever...

您的意思是我需要将m_pStream作为函数-m_hwndPreview=CreateDialogParam(…(LPARAM)this)中的最后一个参数传递;然后我可以在DialogProc函数中访问它,按原样发送它,然后使用instance->m_pStream和我的回答中定义的instance,但当我这样做时,AMEPreviewHandler*instance=(AMEPreviewHandler)lParam;实例->m_流//我收到一个错误C2440:“类型强制转换”:无法从“LPARAM”转换为“AMEPreviewHandler”。我丢失了一个*-您发送了“this”,这是一个指针,但它在prevhost.exe中调试-(AMEShellExtPreviewHandlerFinal.dll)时仍然存在问题:0xC0000005:访问冲突读取位置0x0000000000000030。在调试时的第行(实例->m_pStream)->读取(缓冲区、大小和CbRead);在DialogProc函数内部。当我将光标放在实例上时,它显示m_pstream=????
AMEPreviewHandler* instance = (AMEPreviewHandler *)lParam;
instance->m_Whatever...