By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,001 Members | 1,262 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,001 IT Pros & Developers. It's quick & easy.

Having trouble using CTypes with a custom function

P: n/a
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_trai ts@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.

Oct 4 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
On 4 Oct 2006 11:18:16 -0700, tk*****@gmail.com <tk*****@gmail.comwrote:
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_trai ts@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.

--
http://mail.python.org/mailman/listinfo/python-list
Oct 4 '06 #2

P: n/a
Would you have any example of a wrapper for such data types?

Thanks.

Chris Mellon wrote:
On 4 Oct 2006 11:18:16 -0700, tk*****@gmail.com <tk*****@gmail.comwrote:
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_trai ts@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.

--
http://mail.python.org/mailman/listinfo/python-list
Oct 4 '06 #3

P: n/a
<please don't top post>

On 4 Oct 2006 11:35:11 -0700, tk*****@gmail.com <tk*****@gmail.comwrote:
Would you have any example of a wrapper for such data types?

Thanks.

Chris Mellon wrote:
On 4 Oct 2006 11:18:16 -0700, tk*****@gmail.com <tk*****@gmail.comwrote:
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_trai ts@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.
>
--
http://mail.python.org/mailman/listinfo/python-list
>
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.


--
http://mail.python.org/mailman/listinfo/python-list
Oct 4 '06 #4

P: n/a
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 Mellon wrote:
<please don't top post>

On 4 Oct 2006 11:35:11 -0700, tk*****@gmail.com <tk*****@gmail.comwrote:
Would you have any example of a wrapper for such data types?

Thanks.

Chris Mellon wrote:
On 4 Oct 2006 11:18:16 -0700, tk*****@gmail.com <tk*****@gmail.comwrote:
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_trai ts@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.

--
http://mail.python.org/mailman/listinfo/python-list

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.


--
http://mail.python.org/mailman/listinfo/python-list
Oct 4 '06 #5

P: n/a
tk*****@gmail.com wrote:
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++).

Oct 4 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.