开发者社区> 问答> 正文

如何使用SWIG包装HWND和HINSTANCE类型?

我正在包装一个第三方提供的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

展开
收起
kun坤 2019-12-27 17:18:01 681 0
1 条回答
写回答
取消 提交回答
  • 这些类型在微软文档中是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确实是无效的*根据微软文档页面,那么强制转换将是无操作的。

    2019-12-27 17:18:08
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
编程语言如何演化—— 以 JS 的 private 为例 立即下载
编程语言如何演化-以JS的private为例 立即下载
继承与功能组合 立即下载