我使用vb6通过hack-in:http://windowsdevcenter.com/pub/a/windows/2005/04/26/create_dll.html?page=3创建了一个“标准”dll。我们称之为myVB6dll。在
myVB6dll中的函数(称之为myVB6dllFunc())从隐藏.dll并返回GUID的一个字节(用于测试)。当我从vb6中的测试程序调用myVB6dllFunc()时,它返回正确的值。但是,当从python2.7测试程序调用时,它抛出“accessinvolution writing 0x00000009c”。在
<>一个类似的DLL写在C++中,当从VB6或PythON2.7调用时起作用。在那么,vb6dll真的不是一个标准的dll,而且hack也不起作用(但是它确实可以处理Python调用的vb6dll中的简单测试用例,比如如果我返回两个整数的和)?有没有一种方法可以让它在Python中工作?这两个DLL有什么区别?在
从vb6dll导出函数的最简单方法是使用vbAdvance add-in,现在它是免费软件。在
您面临的问题是,您需要在调用导出的线程上初始化VB6运行时。这包括初始化COM单元(STA)。最简单的方法是从python代码创建VB6类的实例。在
在导出函数中“手动”初始化VB6运行时要困难得多,并且需要使用自定义类型库来调用API函数(在初始化运行时之前不能使用声明或内置VB6函数)。在
这是我正在使用的一个函数
所有API函数(
GetModuleHandle
,GetProcAddress
,RtlMoveMemory
,TlsGetValue
,CoCreateInstance
,CLSIDFromProgID
,VBGUIDFromString
,APIOutputDebugString
)都在自定义类型库中声明。基本上,它在线程上创建一个虚拟的VB6类(称为cDummy
)。如果单元尚未初始化(未调用CoInitialize
),则函数将失败。在相关问题 更多 >
编程相关推荐