我正在用 C# 编写一个小程序,其中包括一个 C++ Dll。
在 C++ 中,有许多类需要实例化并留待以后使用。这看起来像以下函数:
C++:
__declspec(dllexport) FrameCapture* GetFrameCapturer(HWND windowHandle) {
ProcessWindow* window = ProcessWindowCollection::GetInstance()->FindWindow(windowHandle);
FrameCapture* capture = new FrameCapture(window);
return capture;
}
如您所见,我只是创建了一个 FrameCapture 类并返回一个指向它的指针。
此指针作为 IntPtr 存储在 C# 中。
C#:
[DllImport("<dllnamehere>")]
public static extern IntPtr GetFrameCapturer(IntPtr windowHandle);
到目前为止,这非常有效。但是,如果我使用该指针来获取 FrameCapture 的实例
C++:
__declspec(dllexport) BITMAPFILEHEADER* GetBitmapFileHeader(FrameCapture* frameCapturer) {
return frameCapturer->GetBitmapFileHeader();
}
该类将完全是空的。如何获得我在第一步中初始化的类的实例?
编辑:
我做了一些测试并将指针替换为更好看的整数。
我将“捕获”转换为 Int32 并返回它。在我的测试用例中,它返回字节(208,113,244,194)。正如预期的那样,这些值在 C++ 和 C# 中是相同的。
但是,现在变得奇怪了。
如果我将此 Int32 传递给“GetBitmapFileHeader”,则该值突然变为字节(184,231,223,55)。
这甚至不接近!我想到了 Little <-> Big Endian 或类似的东西,但是,这是一个全新的 Memoryblock?
IntPtr 将继续进行相同的行为。
根据要求,我还发布了“GetBitmapFileHeader”的导入
[DllImport("<dllnamehere>")]
public static extern tagBITMAPFILEHEADER GetBitmapFileHeader(IntPtr capturerHandle);