WindowsError: exception: access violation or Windows Error 193 when creating a DLL using ctypes from C++ to Python

WindowsError: exception: access violation or Windows Error 193 when creating a DLL using ctypes from C++ to Python

我从 PyCharm 得到这个错误: Windows错误:异常:访问冲突读取 0x000000504D414C43

它只出现在Pycharm。当我 运行 来自 Windows Powershell 的 python 脚本时,它显示 Windows错误:[错误 193] %1 不是有效的 Win32 应用程序。我检查了调试器并传递了一个值,但它有时出错会给我空指针。起初,我以为我是 运行ning 数组,但即使我只是 return 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++ 文件中有大量列表,我需要遍历这些列表并将 return 一个值传递给 python 脚本。

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

C++代码 (test.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;
}

Python代码

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 函数的参数类型和 return 值。这有助于捕获错误。例如,尝试传递 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