如何在C ++ / CLI代码中引入HWND?
大图 - 我有常规的C ++代码(一些函数放在名称空间中),我有C#代码应该调用这个C ++的东西。 据我所知,唯一的方法就是编写C ++ / CLI包装器。 根据我阅读的内容,我尝试使用reg.C ++中的标题并链接到reg.C ++ dll。
我HWND
的第一个问题是HWND
。 在reg.C ++中它几乎来自于精简版(我甚至没有适当的包含它,并且VS接受它),在CLI / C ++中,我明确地添加了包含c:Program Files (x86)Microsoft SDKsWindowsv7.1AInclude
(*),所以我可以添加
#include <windef.h>
在C ++ / CLI代码中,但它又包含winnt.h
并且在此文件中出现错误。 我觉得我将reg.C ++包含到了CLI / C ++代码中,并且它不适用于此。
那么C ++ / CLI有哪些HWND
定义?
(*)这个目录,因为在reg.C ++项目中VS找到了HWND
的定义。
稍后更新我安装了Windows开发工具包8.0,更改了指向它的路径,包含了windows.h
然后在包含的文件中出现了错误。 为了比较,我问我的同事为我创建一个空白项目,我将它添加到我的解决方案中,并且工作。 所以我相信现在有一些奇怪的事情,我的VS的设置无法正确创建CLI / C ++项目。
在C#中,您使用System.IntPtr来处理win32句柄,因此您应该使用C ++中的System :: IntPtr,它可以安全地投入HWND
看看这个例子代码:
http://blogs.msdn.com/b/yvesdolc/archive/2007/09/10/c-cli-intptr-to-an-hwnd.aspx
你提到用本地C ++,HWND是解决(或声明)没有包含,但你可能想再看一次。 这当然不是这种情况。 有可能你可能使用了一个预编译的头文件(即stdafx.h),它通常包含windows.h,而后者又包含windef.h。 否则,显式包含存在或HWND将不会被定义。
接下来,C ++ / CLI不会禁止你包含windows.h并使用HWND(这很常见,而且我有几个完全相同的项目)。 例如,在D3D互操作或整合媒体基础库的情况下,传递HWND是最经常需要的。
您可能想要开始确保您的包装器库使用裸架构代码编译,包括windows.h。
我强烈希望C ++ / CLI比PInvoke更好,并且您可能已经知道PInvoke也是一个选项,从而不再需要包装器。 但是PInvoke确实具有编组开销,并且相对于入口点签名来说有点脆弱。
我希望这有帮助。 我很乐意帮助解决随后可能出现的问题。
链接地址: http://www.djcxy.com/p/59617.html上一篇: How to introduce HWND in C++/CLI code?
下一篇: C++/CLI wrapper memleak when calling managed lib from unmanaged