在C#中調用void函數(在win32中)我在win32中有以下代碼,它在目標應用程序中設置了一個鉤子。從參數
void InstallHook(DWORD ThreadId)
{
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInstDll, ThreadId);
}
我希望從C#(.net)中調用此函數。
我有這個至今:
[DllImport("TheHookDll.dll")]
public extern static void InstallHook(UInt32 ThreadId);
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
,我這樣稱呼它:
IntPtr hWnd = FindWindow(null, "MyTargetAppWindowTitle");
UInt32 threadID = GetWindowThreadProcessId(hWnd, IntPtr.Zero);
InstallHook(threadID);
這使我的句柄(HWND)爲目標,並使用該線程ID在win32的InstallHook函數中。 (這只是小數,而不是十六進制)
但我得到這個錯誤信息:
檢測PInvokeStackImbalance消息:對PInvoke的功能 「!TheOperator TheOperator.Form1 :: InstallHook」呼叫具有不平衡棧。 這可能是因爲託管PInvoke簽名與非託管目標籤名不匹配 。檢查PInvoke簽名的調用約定和 參數是否與目標非託管 簽名匹配。
我試圖改變調用約定在我的dll文件(配置屬性 - > C/C++ - >所有選項 - >調用約定)從__cdel到__stdcall,但沒有任何運氣。 (同樣的錯誤)
我在做什麼錯?
我已經將DWORD更改爲UInt32,因爲c#不支持DWORD等。但是,這是正確的方式嗎?
任何提示?
[MSDN](http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa383751.aspx):「DWORD - 一個32位無符號整數。範圍是0到4294967295十進制。 「所以匹配的C#類型確實是'UInt32'。 – dtb