我有一个VB6程序。它是编译的(没有可构建的源代码),由.EXE和一些.DLL组成。
我创建了一个简单的Python脚本来调用库中的一些公共方法。不幸的是,Python中没有可用的方法,或者我没有正确地调用它们。
代码:
from ctypes import *
test = windll.LoadLibrary("C:/.../ComDlg32.ocx")
print test
print test.DLLGetDocumentation
输出:
<WinDLL 'C:/.../ComDlg32.ocx', handle 217a0000 at 23a3b10>
<_FuncPtr object at 0x023834E0>
Process finished with exit code 0
我对上面显示的结果没问题。它比我运行相同的代码并尝试使用我们自己的DLL之一给了我更多的信息。我认为Comdlg32.ocx
是供应商提供的控制权。
当我使用一个毫无疑问存在于DLL中的方法对我们自己的DLL运行相同的代码时,我得到了这个:
Traceback (most recent call last):
<WinDLL 'C:/.../ABC123.exe', handle 5f0000 at 2373b30>
File "C:/.../XYZ123.py", line 11, in <module>
print test.Init
File "C:\...\lib\ctypes\__init__.py", line 366, in __getattr__
func = self.__getitem__(name)
File "C:\...\lib\ctypes\__init__.py", line 371, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Init' not found
Process finished with exit code 1
上述结果来自EXE,但DLL返回相同的结果,减去方法名称。
我尝试将DUMPBIN
与/exports
选项一起使用。它没有向我展示任何公共方法。 DUMPBIN
是我在DLLGetDocumentation
中找到OCX
的方式。
还有什么我可以尝试在VB6 DLL中调用方法吗?是否需要使用特定的开关编译VB6项目,以便可以从Python调用公共方法?如何判断/验证VB6是否以不允许方法可调用的方式编译?