P / Invoke编组无效*

时间:2014-04-12 15:24:25

标签: c# pinvoke

我有以下C函数定义:

EXPORT CreateWindow(const wchar_t* applicationTitle, void* windowHandle) {
    // Some preconditions & other stuff here

    windowHandle = RENDER_COMPONENT.Window.CreateNew(cstr_to_wstring(applicationTitle));
    return true;
}

通过P / Invoke调用该函数。 P / Invoke函数定义如下:

[DllImport(InteropUtils.RUNTIME_DLL, EntryPoint = "CreateWindow", CallingConvention = CallingConvention.Cdecl)]
internal static extern bool _CreateWindow([MarshalAs(UnmanagedType.LPWStr)] string applicationTitle, [Out] out IntPtr windowHandle);

此功能的用法是:

IntPtr windowHandle;
bool windowCreationSuccess = _CreateWindow(Engine.ApplicationTitle, out windowHandle);

我的问题是windowHandle总是等于C#代码中的IntPtr.Zero,我猜这意味着它没有被复制'不知何故,从C ++到C#方面。它是在C函数中设置的(我用调试器查看) - 它实际上是一个HWND。

P / Invoke永远不会让我感到困惑 - 我确定我在复制结构而不是对它的引用时做错了什么,但是我不能完全看到/其中。

1 个答案:

答案 0 :(得分:1)

C仅使用pass by value。这意味着调用者永远无法看到您对windowHandle的分配。任何来电者都是这样,而不仅仅是管理的pinvoke。

您需要更改C函数以接收窗口句柄变量的地址。像这样:

EXPORT CreateWindow(const wchar_t* applicationTitle, HWND* windowHandle) {
    // Some preconditions & other stuff here
    *windowHandle = RENDER_COMPONENT.Window.CreateNew(cstr_to_wstring(applicationTitle));
    return true;
}

然后问题中的C#代码匹配。

但是你的C代码很奇怪。你为什么无条件地回归真实?如果总是如此,为什么还要回复bool。坦率地说,返回HWND会更干净。