[英]Preserve C++ Pointer in C#
我正在 C# 中編寫一個小程序,其中包括一個 C++ Dll。
在 C++ 中,有許多類需要實例化並留待以后使用。 這看起來像下面的 function:
C++:
__declspec(dllexport) FrameCapture* GetFrameCapturer(HWND windowHandle) {
ProcessWindow* window = ProcessWindowCollection::GetInstance()->FindWindow(windowHandle);
FrameCapture* capture = new FrameCapture(window);
return capture;
}
如您所見,我只是創建了一個 FrameCapture class 並返回一個指向它的指針。
該指針作為 IntPtr 存儲在 C# 中。
C#:
[DllImport("<dllnamehere>")]
public static extern IntPtr GetFrameCapturer(IntPtr windowHandle);
到目前為止,這非常有效。 但是,如果我使用該指針來獲取 FrameCapture 的實例
C++:
__declspec(dllexport) BITMAPFILEHEADER* GetBitmapFileHeader(FrameCapture* frameCapturer) {
return frameCapturer->GetBitmapFileHeader();
}
class 將完全為空。 如何獲取我在第一步中初始化的 Class 的實例?
編輯:
我做了一些測試並將指針替換為更好看的整數。
我將“捕獲”轉換為 Int32 並返回它。 在我的測試用例中,它返回字節(208,113,244,194)。 正如預期的那樣,該值在 C++ 和 C# 中相同。
但是,現在變得奇怪了。
如果我將此 Int32 傳遞給“GetBitmapFileHeader”,則該值突然變為字節(184,231,223,55)。
那還沒有接近,我想到了Little <-> Big Endian或類似的東西,但是? 這是一個全新的記憶塊?
go 與 IntPtr 的行為相同。
根據要求,我還發布了“GetBitmapFileHeader”的導入
[DllImport("<dllnamehere>")]
public static extern tagBITMAPFILEHEADER GetBitmapFileHeader(IntPtr capturerHandle);
好的,我明白了。
請參閱來自 C# 的此導入。
C#:
[DllImport("<dllnamehere>")]
public static extern tagBITMAPFILEHEADER GetBitmapFileHeader(IntPtr capturerHandle);
這是錯的!
function 現在返回一個工作正常的 IntPtr。
這是新的設置:
C++:
__declspec(dllexport) void* __stdcall GetBitmapFileHeader(void* frameCapturer) {
FrameCapture* cap = (FrameCapture*)frameCapturer;
return cap->GetBitmapFileHeader();
}
C#:
[DllImport("libWinCap.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetBitmapFileHeader(IntPtr frameCapturer);
[...]
//calling
IntPtr ptr = GetBitmapFileHeader(m_capturerHandle);
m_bitmap.m_fileHeader = (tagBITMAPFILEHEADER)Marshal.PtrToStructure(ptr, typeof(tagBITMAPFILEHEADER));
我現在只移動指針並使用 PtrToStructure 讀取 Memory。
另外,感謝您的每一條評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.