2012-05-07 2 views
0

я импортировать две функции 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

Почему вы используете p/invoke из C++/CLI? Вы можете просто использовать сборку смешанного режима и '#include '. –

ответ

2

Неправильное использование свойства ExactSpelling. В user32.dll нет функции FindWindow, как указано в сообщении об исключении. Есть FindWindowA и FindWindowW. Первый обрабатывает унаследованные 8-битовые строки символов, второй использует строки Unicode. Любая функция api для Windows, которая принимает строки, имеет две версии, вы не видите этого в коде C или C++, потому что макрос UNICODE выбирает между ними.

Избегайте ExactSpelling на функциях winapi, маркерщик pinvoke знает, как с этим справиться. У вас есть некоторые другие ошибки, правильная декларация:

[DllImport("user32.dll", CharSet = CharSet::Auto, SetLastError = true)] 
static IntPtr FindWindow(String^ classname, String^ windowname); 
Смежные вопросы