D-DLLs & Python
John Colvin
john.loughran.colvin at gmail.com
Tue Feb 19 09:40:01 PST 2013
On Tuesday, 19 February 2013 at 16:23:45 UTC, Chris wrote:
> I have written a DLL that I load into a Python program.
> Everything works fine (DLL is loaded via ctypes, functions can
> be called and are executed). Only the string handling is giving
> me a bit of a headache. The string in D is always complete
> garbage. I have written Python modules in D (with C wrappers)
> before and got them to work. But the DLL in D seems to be a
> completely different beast. Does anyone have experience with it?
>
> Python uses ctypes, e.g.
>
> myDLL = CDLL("myDLL") / WinDLL("myDLL")
> myDLL.printThis(c_char_p("Hello world")) /
> myDLL.printThis(create_string_buffer("Hello world"))
>
> The D side looks like like this:
>
> export void printThis(ref char[] str) {
> printf("%s\n", str); // prints "Hello World"
> writeln(str); // prints garbage
> }
>
> OR
>
> export void printThis(char* str) {
> printf("%s\n", str); // prints garbage
> writeln(str); // prints garbage
> }
>
> What am I doing wrong / missing here? I guess it has something
> to do with the pointers.
>
> Thanks!
>
> prin
D doesn't use null termination for it's strings, strings are
immutable(char)[]. You can form a D slice from a pointer by going
slice = ptr[0..length]
where length is the length of the array the pointer represents.
You can't just take a c style string and expect writeln to work
with it.
Also, I think you should have extern(C) in the function
definition.
More information about the Digitalmars-d-learn
mailing list