簡體   English   中英

在 C# 中保留 C++ 指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM