2012-05-07 54 views
0

我進口2種WINAPI功能,並利用它們在我的課無法找到一個切入點

using namespace System::Runtime::InteropServices; 

[DllImport("user32",ExactSpelling = true)] 
extern bool CloseWindow(int hwnd); 
[DllImport("user32",ExactSpelling = true)] 
extern int FindWindow(String^ classname,String^ windowname); 

public ref class WinApiInvoke 
{ 
public: 
    bool CloseWindowCall(String^ title) 
    { 
     int pointer = FindWindow(nullptr,title); 
     return CloseWindow(pointer); 
    } 
}; 

然後,我創建主程序對象,並調用CloseWindowCall方法

Console::WriteLine("Window's title"); 
String ^s = Console::ReadLine(); 
WinApiInvoke^ obj = gcnew WinApiInvoke(); 
if (obj->CloseWindowCall(s)) 
    Console::WriteLine("Window successfully closed!"); 
else Console::WriteLine("Some error occured!"); 

當我在控制檯寫例如國際象棋泰坦關閉我有一個錯誤 Unable to find an entry point named 'FindWindow' in DLL 'user32'

什麼切入點?

+2

我認爲它必須是'[DllImport(「user32.dll」)]'。 – svick

+0

爲什麼使用C++/CLI中的p/invoke?您可以只使用混合模式程序集和'#include '。 –

回答

2

您正在使用ExactSpelling屬性不當。 user32.dll中沒有FindWindow函數,就像異常消息所說的那樣。有FindWindowA和FindWindowW。第一個處理傳統的8位字符串,第二個使用Unicode字符串。任何接受字符串的Windows API函數都有兩個版本,你不會在C或C++代碼中看到它,因爲UNICODE宏在兩者之間進行選擇。

避免在winapi函數上使用ExactSpelling,pinvoke編組知道如何處理這個問題。你有一些其他的錯誤,正確的聲明是:

[DllImport("user32.dll", CharSet = CharSet::Auto, SetLastError = true)] 
static IntPtr FindWindow(String^ classname, String^ windowname); 
相關問題