2013-07-22 30 views
0

這裏是從這裏 -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功能我createdialogparam功能這裏是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; 
       }  
} 
} 

和聲明像這樣 -

static BOOL CALLBACK DialogProc(HWND hWindow,UINT uMsg,WPARAM wParam,LPARAM lParam); //假設它是靜態的..它是不會放棄任何錯誤,如果靜態的..如果它不聲明爲靜態的提示錯誤
這裏 -

m_hwndPreview = CreateDialogParam(g_hInst,MAKEINTRESOURCE(IDD_MAINDIALOG), m_hwndParent,(DLGPROC)DialogProc, (LPARAM)this); //error C2440: 'type cast' : cannot convert from 'overloaded-function' to 'DLGPROC' 

有什麼辦法來訪問全局聲明中的變量靜態的DialogProc,或者可以在dialogproc中訪問全局聲明的變量,而無需將這些變量聲明爲靜態,因爲它們在程序的其他部分也被用作非靜態變量。

回答

0

如果

全局聲明靜態DialogProc

內部變量,你的意思是在AMEPreviewHandler實例成員變量,我想你已經送你LPARAM需要的東西:

m_hwndPreview = CreateDialogParam(...(LPARAM)this); 

當它調用你的DialogProc時,這些將轉到最後一個參數:LPARAM lParam因此你可以做

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

你的意思是我需要傳遞m_pStream作爲函數的最後一個參數-m_hwndPreview = CreateDialogParam(...(LPARAM)this);那麼我將能夠訪問它裏面的DialogProc功能 – Sss

+0

發送此爲你,然後使用實例 - > m_pStream與我的回答 – doctorlove

+0

定義的實例,但是當我這樣做AMEPreviewHandler *實例=(AMEPreviewHandler)lParam; \t \t instance-> m_pStream; //我得到一個錯誤錯誤C2440:'type cast':無法從'LPARAM'轉換爲'AMEPreviewHandler' – Sss