请教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') 参考技术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
另外在你空间回答了追问
我传的参数没有敢用string,还需要引用ShareMem单元吗?调用DLL中的带数组参数的方法是不是必须用数组指针?
我空间里的回答我觉得解释的通。之前好像在网上下载过你的某一个小程序,忘了名字了。
如果DLL参数是动态数组可能是需要ShareMem,我没这样用过。只是印象中这样。
另外关于字符串你可以看《Delphi源代码分析》这本书,里面提到的string的格式。
是: 引用计数 + 串长 + 字符串内容
而字符串变量本身是一个指针(4字节),是字符串内容的首地址 (引用计数和串长可以通过此地址-4、 -8得到)
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动态库的传参问题的主要内容,如果未能解决你的问题,请参考以下文章