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!");

当我在控制台中写入例如 Chess Titans 以关闭时出现错误 Unable to find an entry point named 'FindWindow' in DLL 'user32'

什么切入点?

4

1 回答 1

2

您不恰当地使用 ExactSpelling 属性。user32.dll 中没有 FindWindow 函数,就像异常消息所说的那样。有 FindWindowA 和 FindWindowW。第一个处理传统的 8 位字符串,第二个使用 Unicode 字符串。任何接受字符串的 Windows api 函数都有两个版本,您在 C 或 C++ 代码中看不到这一点,因为 UNICODE 宏在两者之间进行选择。

避免在 winapi 函数上使用 ExactSpelling,pinvoke marshaller 知道如何处理这个问题。您还有其他一些错误,正确的声明是:

[DllImport("user32.dll", CharSet = CharSet::Auto, SetLastError = true)]
static IntPtr FindWindow(String^ classname, String^ windowname);
于 2012-05-10T03:55:01.357 回答