我有以下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。
答案 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会更干净。