请教python调用dll动态库的传参问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教python调用dll动态库的传参问题相关的知识,希望对你有一定的参考价值。

不知道你具体是什么问题,下面是python调用win msgbox 和shellexec的方法,可以参考一下:

import ctypes
#win api shellexecuteapiA and msgboxA
 
def execute(path):
    handler = None
    operator = "open"
    fpath = path
    param = None
    dirpath = None
    ncmd = 1
    shell32 = ctypes.windll.LoadLibrary("shell32.dll")
    shell32.ShellExecuteA(handler,operator,fpath,param,dirpath,ncmd)
 
def msgbox(msg='mesage'):
    user32 = ctypes.windll.LoadLibrary('user32.dll')
    user32.MessageBoxA(0, msg.decode('utf8').encode('gbk'), 'aaaaaaa',0)
     
if __name__ == '__main__':
        execute('config.ini')
        msgbox('aaaaaa')

参考地址:http://www.pubwin2009.net/index.php/python/27.html

参考技术A COM对象抑或其他?

你好,请教一个问题,delphi如何调用DLL中的一个带动态数组参数的方法?

我定义的结构体:
TFieldInfo = record
FileName: PChar;
DisplayText: PChar;
NotNull: Boolean;
end;

TFieldInfos = array of TFieldInfo;

DLL(自己用delphi写的)中的函数需要传递一个动态数组:
函数声明如:
function ImportData(AFieldInfo: array of TFieldInfo): Boolean;
或:function ImportData(AFieldInfo: TFieldInfos): Boolean;

应该如何调用?如果该方法不是在DLL中封装,调用没有问题,但如果封装到DLL中,调用报地址错误。

另外,还有一个疑问,见链接:http://user.qzone.qq.com/303163222/infocenter#!app=2&via=QZ.HashRefresh&pos=1339581464

应该是DLL和EXE都引用ShareMem就可以了

另外在你空间回答了追问

我传的参数没有敢用string,还需要引用ShareMem单元吗?调用DLL中的带数组参数的方法是不是必须用数组指针?
我空间里的回答我觉得解释的通。之前好像在网上下载过你的某一个小程序,忘了名字了。

追答

如果DLL参数是动态数组可能是需要ShareMem,我没这样用过。只是印象中这样。

另外关于字符串你可以看《Delphi源代码分析》这本书,里面提到的string的格式。
是: 引用计数 + 串长 + 字符串内容
而字符串变量本身是一个指针(4字节),是字符串内容的首地址 (引用计数和串长可以通过此地址-4、 -8得到)

来自:求助得到的回答
参考技术A 个人一点建议,你觉得有理就试试,否则就当我没说:
1、凡是写dll,尽量不要把Delphi的string和动态数组作为参数传递,因为这些玩意都是Delphi的独门类型(含有计数引用、长度等额外的狗屎东西),Windows认识你Delphi老大贵姓?Windows API哪个含有动态类型的参数?全用的指针!
2、动态数组变量本身就是个指针,直接使用它本来面目进行传递。这样改函数:
function ImportData(FieldInfosPtr: Pointer): Boolean;
var
AFieldInfo: TFieldInfos;
begin
AFieldInfo := FieldInfosPtr;
其它部分不变...
end;
参考技术B var
fieldInfo:TFieldInfo;
调用:
ImportData( @fieldInfo);

以上是关于请教python调用dll动态库的传参问题的主要内容,如果未能解决你的问题,请参考以下文章

请教python调用dll动态库的传参问题

vc动态链接库的调用 LoadLibrary()路径问题

python中调用 C#动态链接库问题记录

请教关于linux中静态库与动态库的问题

Python调用DLL动态链接库——ctypes使用

VB中调用Class(类模块)及调用DLL(动态链接库)问题