Не могу передать строку в char * arg вызова функции в dll в python - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь использовать dll в исходном коде Python, используя ctypes. Я начал читать это из документации Python, поскольку я новичок в этом. После успешной загрузки DLL в Python, когда я пытаюсь передать строку в функцию, которая ожидает 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 реализован в файле cpp, который доступен в dll export,

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;
}

Ваша помощь очень ценится.

1 Ответ

2 голосов
/ 10 ноября 2011

Скорее всего, причиной ошибки является несоответствие соглашений о вызовах. Я предполагаю, что ваши C ++ DLL экспортируют функции с cdecl соглашением, но использование WinDLL подразумевает stdcall.

Создайте свою библиотеку, чтобы использовать cdecl:

lpDLL=CDLL("C:\some_path\myDll.dll")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...