Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193



我从PyCharm收到此错误:Windows错误:异常:访问冲突读取0x000000504D414C43

它只发生在Pycharm中。当我从 Windows Powershell 运行 python 脚本时,它说WindowsError: [Error 193] %1 不是有效的 Win32 应用程序。我检查了调试器并传递了一个值,但它的错误有时会给我空指针。起初,我以为我正在脱离数组,但即使我只返回 7(如您在底部看到的(并注释掉所有代码,它仍然会按照描述进行操作。

问题:

1( 您有什么解决方案吗?

2( 我是否正确设置了 DLL?

3(有什么建议吗?

非常感谢您的帮助。

这是我C++代码:

#include <iostream>
#include <string>
#include <array>
#include "external_lists.h"
extern creation_object A1[];
extern creation_object  A2[];
extern int A1size;
extern int A2size;

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int get_creation_data(std::string needed_name){
int A1_size = ( A1size/ sizeof(A1[0])) ;
int A2_size = ( A2size / sizeof(A2[0]))  ;
for (int i = 0; i < A1_size; i++) {
if (A1[i].name == needed_name) 
{ 
return A1[i].value->section; 
}
}
return 7;
}

这是我的 python 包装器:

import os, sys, re
from ctypes import *
def get_creation_values(value_name):
trimdll = CDLL('C:\Documents\creation.dll')
return valuedll.get_creation_data(value_name)
if __name__ == "__main__":
val = get_value('CLAMP')
print(val)

总体目标:

我有一个大文件,我无法修改,但需要C++访问。C++文件中有大量列表,我需要遍历这些列表并向 python 脚本返回值。

ctypes只理解C类型。 可以将字节字符串作为const char*传递,并在需要时将其分配给std::string。 下面是一个完整的工作示例:

C++代码(测试.cpp(

#include <string>
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int get_creation_data(const char* name) {
std::string needed_name(name);
if(needed_name == "Armaja")
return 1;
return 0;
}

蟒蛇代码

from ctypes import *
def get_creation_values(value_name):
trimdll = CDLL('test')
trimdll.get_creation_data.argtypes = [c_char_p]
trimdll.get_creation_data.restype = c_int
return trimdll.get_creation_data(value_name)
if __name__ == "__main__":
val = get_creation_values(b'Armaja')
print(val)

输出:

1

请注意如何指定 DLL 函数的参数类型和返回值。 这有助于捕获错误。 例如,尝试传递 Unicode 字符串'Armaja'而不是字节字符串b'Armaja'(Python 3 语法(:

Traceback (most recent call last):
File "C:test.py", line 10, in <module>
val = get_creation_values('Armaja')
File "C:test.py", line 7, in get_creation_values
return trimdll.get_creation_data(value_name)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

最新更新