Having trouble using CTypes with a custom function

T

tkondal

Hi all.

I just started looking at Python's ctypes lib and I am having trouble
using it for a function.

For starters, here's my Python code:


from ctypes import*;
myStringDLL= cdll.LoadLibrary("myStringDLL.dll");

GetMyString = getattr(myStringDLL,
"?GetMyString@@YA_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z")

strString = create_string_buffer('\000' * 256);
GetMyString.restype = c_int;
GetMyString.argtypes = [c_char_p];

bResult = GetMyString (strSerialNumber);

print (bResult);
print (strSerialNumber);

#C++ Prototype of the function I want to call:
#bool GetMyString (string& stringParam) ;




I do not have access to the source code of this function so don't ask
me to try different things in C++. This DLL is working fine.

The problem that I have is that print (strSerialNumber) does not seem
to print the correct string. What I get is some garbage value of
unprintable characters. Am I using this the correct way?

Thanks.
 
C

Chris Mellon

Hi all.

I just started looking at Python's ctypes lib and I am having trouble
using it for a function.

For starters, here's my Python code:


from ctypes import*;
myStringDLL= cdll.LoadLibrary("myStringDLL.dll");

GetMyString = getattr(myStringDLL,
"?GetMyString@@YA_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z")

strString = create_string_buffer('\000' * 256);
GetMyString.restype = c_int;
GetMyString.argtypes = [c_char_p];

bResult = GetMyString (strSerialNumber);

print (bResult);
print (strSerialNumber);

#C++ Prototype of the function I want to call:
#bool GetMyString (string& stringParam) ;




I do not have access to the source code of this function so don't ask
me to try different things in C++. This DLL is working fine.

The problem that I have is that print (strSerialNumber) does not seem
to print the correct string. What I get is some garbage value of
unprintable characters. Am I using this the correct way?




This function is expecting a C++ std::string object, not a regular C
style string. You'll need a wrapper function, and one which uses the
same compiler and STL as the C++ source.
 
T

tkondal

Would you have any example of a wrapper for such data types?

Thanks.

Chris said:
Hi all.

I just started looking at Python's ctypes lib and I am having trouble
using it for a function.

For starters, here's my Python code:


from ctypes import*;
myStringDLL= cdll.LoadLibrary("myStringDLL.dll");

GetMyString = getattr(myStringDLL,
"?GetMyString@@YA_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z")

strString = create_string_buffer('\000' * 256);
GetMyString.restype = c_int;
GetMyString.argtypes = [c_char_p];

bResult = GetMyString (strSerialNumber);

print (bResult);
print (strSerialNumber);

#C++ Prototype of the function I want to call:
#bool GetMyString (string& stringParam) ;




I do not have access to the source code of this function so don't ask
me to try different things in C++. This DLL is working fine.

The problem that I have is that print (strSerialNumber) does not seem
to print the correct string. What I get is some garbage value of
unprintable characters. Am I using this the correct way?




This function is expecting a C++ std::string object, not a regular C
style string. You'll need a wrapper function, and one which uses the
same compiler and STL as the C++ source.
 
C

Chris Mellon

<please don't top post>

Would you have any example of a wrapper for such data types?

Thanks.

Chris said:
Hi all.

I just started looking at Python's ctypes lib and I am having trouble
using it for a function.

For starters, here's my Python code:


from ctypes import*;
myStringDLL= cdll.LoadLibrary("myStringDLL.dll");

GetMyString = getattr(myStringDLL,
"?GetMyString@@YA_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z")

strString = create_string_buffer('\000' * 256);
GetMyString.restype = c_int;
GetMyString.argtypes = [c_char_p];

bResult = GetMyString (strSerialNumber);

print (bResult);
print (strSerialNumber);

#C++ Prototype of the function I want to call:
#bool GetMyString (string& stringParam) ;




I do not have access to the source code of this function so don't ask
me to try different things in C++. This DLL is working fine.

The problem that I have is that print (strSerialNumber) does not seem
to print the correct string. What I get is some garbage value of
unprintable characters. Am I using this the correct way?




This function is expecting a C++ std::string object, not a regular C
style string. You'll need a wrapper function, and one which uses the
same compiler and STL as the C++ source.

in this case it'd be very simple:

bool WrapGetMyString(char * c) {
return GetMyString(c)
}


(Note: This isn't unicode safe).

The C++ compiler will handle converting from the char * to the std::string.




 
T

tkondal

Hi Chris.

I know that it is easy to fix the problem using C++. However, I do not
want to code a wrapper DLL. I was wondering if there was a workaround
with Python. Everything has to be done in Python as we do not have the
tools for C++ (and we are not planning on getting any).

Thanks.

Chris said:
<please don't top post>

Would you have any example of a wrapper for such data types?

Thanks.

Chris said:
Hi all.

I just started looking at Python's ctypes lib and I am having trouble
using it for a function.

For starters, here's my Python code:


from ctypes import*;
myStringDLL= cdll.LoadLibrary("myStringDLL.dll");

GetMyString = getattr(myStringDLL,
"?GetMyString@@YA_NAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z")

strString = create_string_buffer('\000' * 256);
GetMyString.restype = c_int;
GetMyString.argtypes = [c_char_p];

bResult = GetMyString (strSerialNumber);

print (bResult);
print (strSerialNumber);

#C++ Prototype of the function I want to call:
#bool GetMyString (string& stringParam) ;




I do not have access to the source code of this function so don't ask
me to try different things in C++. This DLL is working fine.

The problem that I have is that print (strSerialNumber) does not seem
to print the correct string. What I get is some garbage value of
unprintable characters. Am I using this the correct way?





This function is expecting a C++ std::string object, not a regular C
style string. You'll need a wrapper function, and one which uses the
same compiler and STL as the C++ source.

Thanks.

in this case it'd be very simple:

bool WrapGetMyString(char * c) {
return GetMyString(c)
}


(Note: This isn't unicode safe).

The C++ compiler will handle converting from the char * to the std::string.




 
S

sjdevnull

Hi all.

I just started looking at Python's ctypes lib and I am having trouble
using it for a function. [...]
#C++ Prototype of the function I want to call:

ctypes provides support for calling functions in C libraries, using C
datatypes. I don't see any reason to believe it would work with other
languages (e.g. C++).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,740
Latest member
JudsonFrie

Latest Threads

Top