我正在包装一个第三方提供的Windows DLL与SWIG在Python中使用。我已经能够成功地编译我的SWIG模块,并将其导入Python,但我遇到了一个函数的问题(从。h头文件):
_APPFN ServerID _CALLCONV OpenServer(HINSTANCE hAppInst, HWND hWnd);
我在使用这个函数时遇到了一些问题,因为在Python中我没有HINSTANCE或HWND的类型。根据这个函数的文档,这些值可以是null、0,或者基本上是任何值(目前还没有使用的特性),所以我试图找出如何使用typemap来生成这些整数,这样我就可以传递0了。从我的i档案:
/* handle HINSTANCE */
%typemap(in) HINSTANCE {
$1 = PyInt_AsLong($input);
}
/* handle hwnds */
%typemap(in) HWND {
$1 = PyInt_AsLong($input);
}
当我尝试用上面的类型映射来编译我的包装器文件时(我使用的是Visual Studio),我得到了错误:不能从'long'转换为'HINSTANCE',也不能从'long'转换为'HWND'。 根据我的阅读,我认为HINSTANCE和HWND是“struct”,所以我需要做一些事情来将struct“cast”成一个整数,但不幸的是,这些都超出了我的理解范围。我基本上是自学的Python程序员,处理C/ c++数据类型相当令人困惑。 我希望有人能看到我在做什么,并指导我如何需要改变我的排版。 问题来源StackOverflow 地址:/questions/59382118/how-do-i-wrap-hwnd-and-hinstance-types-with-swig
这些类型在微软文档中是void*s: https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types 虽然可以肯定的是,cppyy(通过对Windows头文件的Clang解析)将它们解析为指向不透明类型的指针(即声明了前向,但没有定义):
$ python
>>> import cppyy
>>> print(cppyy.gbl.HWND)
<cppyy.TypedefPointerToClass object at 0x00000245E8839558>
>>>
所以如果你想确定的话,你可能需要查找typedefs。 但是,不管HWND和HINSTANCE是指向不透明类的指针还是指向void的指针,即使您可以在32b Windows上对它们进行强制转换,在64b上从long到void*(或“不透明*”)的强制转换也不起作用,因为long值将被截断。因此,在类型映射中使用PyLong_AsVoidPtr而不是PyInt_AsLong。参见Python C-API文档: https://docs.python.org/3/c-api/long.html#c.PyLong_AsVoidPtr 如果类型是不透明类,您还需要显式的强制转换,最后的代码应该是:
/* handle HINSTANCE */
%typemap(in) HINSTANCE {
$1 = (HINSTANCE)PyLong_AsVoidPtr($input);
}
/* handle hwnds */
%typemap(in) HWND {
$1 = (HWND)PyLong_AsVoidPtr($input);
}
当然,如果HWND和HINSTANCE确实是无效的*根据微软文档页面,那么强制转换将是无操作的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。