在 VB6 中创建的 "standard" DLL 在 Python 中调用时会出现访问冲突
"standard" dll created in vb6 gives access violation when called in python
我使用vb6通过破解创建了一个"标准"dll:http://windowsdevcenter.com/pub/a/windows/2005/04/26/create_dll.html?page=3.让我们称之为myVB6dll。
myVB6dll中的一个函数(称为myVB6dllFunc())从hid.dll调用HidD_GetHidGuid(),并返回GUID的一个字节(用于测试目的)。当我从vb6中的测试程序调用myVB6dllFunc()时,它会返回正确的值。然而,当从python2.7测试程序调用时,它会抛出"写入0x00000009c的访问冲突"。
当从VB6或Python2.7调用时,用C++编写的类似dll也能工作。
那么,VB6 dll真的不是一个标准的dll吗?黑客攻击真的不起作用(但它确实适用于Python调用的VB6 dll的简单测试用例,比如如果我返回两个整数的和)?有没有办法让它在Python中工作?这两个dll之间有什么区别?
从VB6 dll导出函数的最简单方法是使用vbAdvance加载项,现在它是免费的。
您面临的问题是,您需要在调用导出的线程上初始化VB6运行时。这也包括初始化COM单元(STA)。最简单的方法是从python代码中创建一个VB6类的实例。
在导出函数中"手动"初始化VB6运行时要困难得多,并且需要使用自定义typelib来调用API函数(在初始化运行时之前不能使用声明或内置VB6函数)。
这是我正在使用的函数
Private Function pvInitVbRuntime() As Boolean
' Const FUNC_NAME As String = "pvInitVbRuntime" '
Const PROGID_DUMMY As String = LIB_NAME & ".cDummy"
Dim lIdx As Long
lIdx = GetModuleHandle("MSVBVM60.DLL")
lIdx = GetProcAddress(lIdx, "__vbaSetSystemError")
Call RtlMoveMemory(lIdx, ByVal lIdx + 9, 4)
Call RtlMoveMemory(lIdx, ByVal lIdx, 4)
If TlsGetValue(lIdx) <> 0 Then
Call CoCreateInstance(CLSIDFromProgID(PROGID_DUMMY), Nothing, CLSCTX_INPROC_SERVER, VBGUIDFromString("{00000000-0000-0000-C000-000000000046}"), Nothing)
pvInitVbRuntime = True
Else
' Call APIOutputDebugString(GetCurrentThreadId() & ": not a VB thread [" & LIB_NAME & "." & MODULE_NAME & "." & FUNC_NAME & "]" & vbCrLf) '
End If
End Function
所有API函数(GetModuleHandle
、GetProcAddress
、RtlMoveMemory
、TlsGetValue
、CoCreateInstance
、CLSIDFromProgID
、VBGUIDFromString
、APIOutputDebugString
)都在自定义类型库中声明。基本上,它在线程上创建了一个伪VB6类(称为cDummy
)。如果单元尚未初始化(未调用CoInitialize
),则函数将失败。
- 从Delphi调用C++DLL时发生访问冲突
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 为什么创建进程 API 调用会导致内存访问冲突?
- 引发访问冲突的 Win32 API 调用
- 使用全局引用调用函数时访问冲突
- 调用指针时违反 C++ Typedef 访问冲突
- 调用基构造函数时遇到问题 - 获取读取访问冲突
- 调用隔离后访问冲突执行位置0x0000000000000000:New()
- 调用堆栈中的访问冲突
- 从C#返回调用C++dll函数的值时发生访问冲突
- 0xC0000005:调用CopyMemory()后发生访问冲突
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- 调用std::vector::empty()时内存访问冲突读取位置
- mfc应用程序结束后,CMainFrame的析构函数调用发生访问冲突
- 调用基类的方法时发生访问冲突
- 从非托管c++调用WCF服务导致访问冲突
- sp_session_process_events在调用sp_session_login后导致访问冲突
- glTranslate()调用时发生访问冲突
- 访问冲突调用导入函数