【问题标题】:Can't pass a string to char * arg of function call in dll in python无法将字符串传递给python中dll中函数调用的char * arg
【发布时间】:2011-11-09 20:34:01
【问题描述】:

我正在尝试使用 ctypes 在 Python 源代码中使用 dll。我开始从 Python 文档中阅读它,因为我是新手。在 Python 中成功加载 dll 后,当我尝试将字符串传递给需要 char * 的函数时,它给了我

"ValueError: 过程可能调用了太多参数(4 字节)”。

我也尝试查看其他帖子,但无法解决问题。

我尝试了不同的方法来传递这个字符串,例如使用byref()pointer(),但它并没有改变结果。我也尝试过WINFUNCTYPE,但失败了。我使用的dll是windll。

这是我用python写的一个测试程序:

from ctypes import *

lpDLL=WinDLL("C:\some_path\myDll.dll")
print lpDLL

IP_ADDR = create_string_buffer('192.168.100.228')
#IP_ADDR = "192.168.100.228"
#IP_ADDR = c_char_p("192.168.100.228")

print IP_ADDR, IP_ADDR.value

D_Init=lpDLL.D_Init
D_InitTester=lpDLL.D_InitTester

#D_InitTesterPrototype = WINFUNCTYPE(c_int, c_char_p)
#D_InitTesterParamFlags = ((1, "ipAddress", None),)
#D_InitTester = d_InitTesterPrototype(("D_InitTester", lpDLL), D_InitTesterParamFlags)

try:
    D_Init()
    D_InitTester("192.168.100.254")
except ValueError, msg:
    print "Init_Tester Failed"
    print msg

以下是 D_InitTester 在 dll 导出中可用的 cpp 文件中的实现方式,

D_API int D_InitTester(char *ipAddress)
{
    int err = ERR_OK;

    if (LibsInitialized)
    {
        ...
        some code;
        ...

        else
        {
            err = hndl->ConInit(ipAddress);
        }

        if ( 0 < err )
        {
            err = ERR_NO_CONNECTION;
        }
        else
        {
        nTesters = 1;
            InstantiateAnalysisClasses();
            InitializeTesterSettings();
            if(NULL != hndl->hndlFm)
            {
                FmInitialized = true;
            }
        }
    }
    else
    {
        err = ERR_NOT_INITIALIZED;
    }
    return err;
}

非常感谢您的帮助。

【问题讨论】:

    标签: python dll


    【解决方案1】:

    错误的原因很可能是调用约定不匹配。我猜你的 C++ DLL 使用 cdecl 约定导出函数,但你使用 WinDLL 意味着 stdcall

    像这样创建您的库以使用cdecl

    lpDLL=CDLL("C:\some_path\myDll.dll")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多