2

Python 2.5に関しては、次のCコードをPythonで実装したいと思います。

Cコード:

#include <wtypes.h>

__declspec(dllexport) X_ERROR __stdcall GetAdmSize(INT* piAdmSize, CHAR** chBuf, INT iBufSize);

int iProgSize = 0;
char szProgSize[50];
char* pszProgSize = szProgSize;
error = GetAdmSize(&iProgSize, &pszProgSize, 49);

Pythonコード:

from ctypes import *
c_bool = c_int

x = windll.LoadLibrary("x.dll")
iProgSize = c_int()
szProgSize = create_string_buffer(50)
getAdmSize = x.AdkGetAdmSize
getAdmSize.argtypes = [POINTER(c_int), POINTER(c_char_p), c_int]
status = getAdmSize(byref(iProgSize), byref(szProgSize), 49)

しかし、次の例外が発生します。

Traceback (most recent call last):
    status = getAdmSize(byref(iProgSize), (szProgSize), 49)
ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected LP_c_char_p instance instead of c_char_Array_50

私は何が間違っているのですか?

アップデート:

私は試した:

pointerToStringBuffer = cast(szProgSize, c_char_p)
status = getAdmSize(byref(iProgSize), byref(pointerToStringBuffer), 49)

しかし、これは私に与えます:

Traceback (most recent call last):
    status = getAdmSize(byref(iProgSize), byref(pointerToStringBuffer), 49)
WindowsError: exception: access violation reading 0x00000031

興味深いことに、これを呼び出すと、Cでも同じエラーが発生します。

error = AdkGetAdmSize((int*)0, (char**)49, 0);

私の議論が正しく調整されていないようです

助言がありますか?

4

2 に答える 2

3

Cコードを直接翻訳すると、次のようになります。

from ctypes import *
x = windll.LoadLibrary("x.dll")
iProgSize = c_int(0)
szProgSize = create_string_buffer(50)
pszProgSize = c_char_p(addressof(szProgSize))
getAdmSize = x.GetAdmSize
getAdmSize.argtypes = [POINTER(c_int), POINTER(c_char_p), c_int]
status = getAdmSize(byref(iProgSize), byref(pszProgSize), 49)

私がテストした偽のDLL:

typedef int X_ERROR;
typedef int INT;
typedef char CHAR;

#include <string.h>

__declspec(dllexport) X_ERROR __stdcall GetAdmSize(INT* piAdmSize, CHAR** chBuf, INT iBufSize)
{
    *piAdmSize = 5;
    strcpy_s(*chBuf,iBufSize,"abcd");
    return 1;
}

結果:

>>> x.iProgSize
c_long(5)
>>> x.pszProgSize
c_char_p('abcd')
>>> x.szProgSize.value
'abcd'
于 2012-05-26T01:12:51.660 に答える
0

私はそれを理解したと思います。また、リターンタイプを指定する必要がありました。

getAdmSize.restype = X_ERROR
于 2012-05-25T22:35:04.187 に答える