gpt4 book ai didi

c++ - 在 vb6 中创建的 "standard"dll 在 python 中调用时会出现访问冲突

转载 作者:行者123 更新时间:2023-11-28 00:59:53 27 4
gpt4 key购买 nike

我通过黑客攻击使用 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 吗?这个 hack 并没有真正起作用(但它确实适用于 Python 调用的来自 vb6 dll 的简单测试用例,例如,如果我返回两个整数的总和)?有没有办法让它在 Python 中工作?这两个dll有什么区别?

最佳答案

从 VB6 dll 导出函数的最简单方法是使用 vbAdvance add-in现在是免费软件。

您面临的问题是您需要在调用导出的线程上初始化 VB6 运行时。这也包括初始化 COM 单元 (STA)。最简单的方法是从您的 Python 代码创建一个 VB6 类的实例。

在导出函数中“手动”初始化 VB6 运行时要困难得多,并且需要使用自定义类型库来调用 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 函数(GetModuleHandleGetProcAddressRtlMoveMemoryTlsGetValueCoCreateInstanceCLSIDFromProgIDVBGUIDFromStringAPIOutputDebugString) 在自定义类型库中声明。基本上它在线程上创建一个虚拟 VB6 类(称为 cDummy)。如果公寓尚未初始化(未调用 CoInitialize),则该函数失败。

关于c++ - 在 vb6 中创建的 "standard"dll 在 python 中调用时会出现访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9304562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com