我想要调用一个别人给的 dll 文件,总是出错,于是我想着写个最简单的 hello world 版的 dll 文件,调用一下,来确定我在网上找的调用代码是正确的
这是我看的制作 dll 文件的教程:http://wolfprojects.altervista.org/dllforpyinc.php
//main.cpp
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a, int b) {
return a + b;
}
//main.h
int sum(int, int);
我用 Code::Blocks 自带的 GCC 和 VS2008 分别编译出了 dll 文件,但是调用的时候都会报错
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
我的环境是 Windows 7(64),Python 3.6.0(64),我也将生成的 dll 放到 XP 上运行过,XP 上是 Python2.7(32)
File "C:\Python27\lib\ctypes\__init__.py", line 440, in LoadLibrary
return self._dlltype(name)
File "C:\Python27\lib\ctypes\__init__.py", line 362, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 14001]
尝试多次,我按照上边教程中的,在 Linux 下生成 so 库,运行的比较正常
这是 python 代码,后来我想到下载了一个标准库 msvcrt,可以正常调用
#!/bin/env python
# -*- coding: utf-8 -*-
from ctypes import cdll
# mydll = cdll.LoadLibrary('msvcrt.dll')
# mydll.printf(b"hello world!")
mydll = cdll.LoadLibrary('test.dll')
print(mydll)
所以我感觉问题还是出在 dll 这方面,这是我的分析:
1,可能是调用方式问题,查询看 dll 有不同的调用方式有,stdcall cdecl 等,不过我换用 ctypes 的 windll 调用还是不行
2,可能是编码问题,查询过程中有 ANSI,和 Unicode 两种,看到有人给出如下代码,我用 msvcrt 测试,不过我运行会提示 AttributeError: function 'printf' not found
libHandle = ctypes.cdll.kernel32.LoadLibraryW('msvcrt.dll')
lib = ctypes.CDLL(None, handle=libHandle)
lib.printf(b"hello world!")
现在有点不知从哪里入手解决,先谢谢了
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.