2012-12-27 83 views
2

我嘗試在VS 2010中創建一個託管C++程序集,以與WinAPI進行接口並將其用於其他C#程序集。我讀過所有文章,甚至在GitHub的代碼中搜索,但都沒有成功。 也許它關於錯誤消息中的__clrcall,它不應該是__stdcall嗎?有任何想法嗎?無法從'LRESULT(__clrcall ....)'轉換爲'WNDPROC'

確切的錯誤信息是:

錯誤C2440: '=':不能從轉換 'LRESULT(__clrcall XXX :: Win32Demo :: *)(HWND,UINT,WPARAM,LPARAM)' 到 'WNDPROC'

的源代碼:

#pragma once 

using namespace System; 
using namespace System::Drawing; 

#include "stdafx.h" 
#include "windows.h" 

namespace xxx 
{ 

ref class Win32Demo 
{ 

private: HWND__ * handle; 
private: static Char * windowClass; 

public: 

Win32Demo(void) 
{ 
} 

static Win32Demo() 
{ 
    tagWNDCLASSEXW w; 
    windowClass = (wchar_t*) L"Hello"; 

    w.cbSize = sizeof(tagWNDCLASSEXW); 
    w.style = 0x803; 
    w.lpfnWndProc = WindowProc; // Error 
    w.cbClsExtra = 0; 
    w.cbWndExtra = 0; 
    w.hInstance = 0; 
    w.hIcon = 0; 
    w.hCursor = 0; 
    w.hbrBackground = CreateSolidBrush(0); 
    w.lpszMenuName = NULL; 
    w.lpszClassName = windowClass; 
    w.hIconSm = 0; 
} 

public : 
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    return 0; 
} 

}; 
} 
+0

試試'w.lpfnWndProc =(WNDPROC)WindowProc;' –

+2

@BartekBanachewicz這可能不起作用。它將刪除編譯器錯誤,但您可能會收到運行時錯誤。 – user1610015

+0

試試'w.lpfnWndProc =&Win32Demo :: WindowProc;' – acraig5075

回答

1

,因爲你的WndProc()函數被編譯爲IL,而不是機器代碼此出錯。發生這種情況是因爲您使用/ clr生效。這不僅僅是編譯時錯誤,它也不能在運行時工作。 Windows不知道如何調用託管方法,而不是沒有從Marshal :: GetFunctionPointerForDelegate()獲得的那種幫助。

最好不要去那裏。將此代碼移動到您不帶/ clr選項編譯的獨立.cpp文件中。或者在此代碼之前使用#pragma managed(push, off),以便將其編譯爲機器代碼而不是IL。

並考慮爲您提供相同功能的託管類包裝。就像System.Windows.Forms命名空間中的類一樣。或者,如果您想保留此代碼,則從NativeWindow類派生自己的類以附加窗口句柄,從而允許您使用託管代碼覆蓋WndProc()。

0

顯然不支持託管類的方法__stdcall調用約定。使您獲得有關這樣的東西上的警告警告依次爲:所以你需要把的WindowProc非託管類中:

class WindowProcCallback 
{ 
public: 
    static LRESULT __stdcall WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    { 
     ... 
    } 
}; 

ref class Win32Demo 
{ 
    ... 
}; 

一個建議。有警告你會得到以下警告:

warning C4441: calling convention of '__stdcall ' ignored; '__clrcall ' used instead

相關問題