On Tuesday, 19 February 2013 at 17:40:03 UTC, John Colvin wrote:

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.


I had tried to!string() and the slicing already but to no avail. I think it has something to do with pointer and the stack. Here is what I get

export void printThis(ref char[] str) {
        printf("Incoming printf: %s\n", str);
        writeln(str);
        writeln(str.ptr);
        writeln(str[0..5]);
        writeln(to!string(str.ptr));
        writeln(to!string(str.ptr[0..5]));
        writeln(to!string(str)); // Error!
}


OUTPUT:

Incoming printf: Hello world
☺
27FBCC
☺
☺
☺
Traceback (most recent call last):
  File "loaddll.py", line 6, in <module>
    lib.printThis(c_char_p("Hello world"))
WindowsError: exception: access violation reading 0x00284000

If I use writefln("%s\n", str) I get the full garbage which starts with

☺ ☺ 0³' ░ï^ ♦ ☺ (←5 8¹' l¹' x ' x ' 1þ→↔A±ôj ░³' .ö→↔☺◄ D0 ► ô→↔ æ"☻­C←↔Jô→↔È1←↔ ß"☻¶)"☻ °;5 +Æ→↔á╚h P®h P®h `³' ► P³' 0³' ░ï^ p ³' ☺ a↨»wxY#☻êS→↔D0 ►P®h ☺◄ ░<$☻ á╚h ►Q→↔á╚h xY#☻ ░<$☻ D0 ► \¬▲ P®h ─²' ¬Ø♫▲á╚h P®h á╚h ☺ ☺ P®h EÑ♫▲á╚h ☺ ☺ æ"☻╚Ui Ó("☻hj] └Ui ╣¢♫▲Ô╚♫▲─²' ­½] ­½] └Ui  ' æ"☻Ó("☻ fÉ"☻☺ 4É"☻ ÞJh (←5 á*♥▲­½] └Ui H▒ ▲─Ui ♥          p■] ıÏ♫▲êTi ­½] ú/5  ' (Ô$☻+¯♫▲ê♀"☻ú/5 └Ui (←5 2┘♫▲­½] êTi ­&^

3◄▲­½] ­&^ ­&^ (Ô$☻Ó┌5 ED◄▲(Ô$☻­&^ ­&^ ☺ ú/5ttt®/5 ¤I◄tttú/5 ☺☺ ­&^ ­&^ ☺  ' ☺ tttú/5 ▬☻nt­&^ ☺ ¨Rtttú/5 ☺  ' ðÚmttt§ç♥tttú/5 ☺  ' |3 ↔☺ ê ' ú/5 ttt Âü☺ !☻ +e▲Q ╚¬$Q +e ▲Q m◄ ↔☻ É/5 ÿ 5 í9┐w Ó²~ X ' ×⌂P¢─ ' U▬ ↔±þÿj ö ' ¬3╚v Ó ²~È ' ‗×┐w Ó²~M∟ºw Ó²~ á '     ıq├w®&> ý ' ┼×┐w¶‼ ↔ Ó ²~ ¶‼ ↔ Ó²~ Actx ☺ ♀3 ▄ ¶ ☺ 4 |☺ ☺ ☻ N´&→ÿ☻ D Ó☻ `☻ ║q2¾@♣ J î♣ ▲♥ [IY 2 ♥ ═Û╬2Ó♂ B $♀ 6♥ ╚_P8\☼ ^ ╝☼ h♥ D♣(▒$‼ V |‼ ÿ♥ ► ý ☻ ☺ |☺ ð§ ☺ ☻ L↨ á ☺ ♥ ý▲ î♫ ☺ ♦ x- ¶♥ ☻ ♣ î0 ÿ ☻ ♠ $1 ╠ ☻ ­1 ­ ☺ Ó2 ( ☻ ♂
 3  ♦   ☺   SsHd,   ☺   ☺   ☺   ♠   î   ☺   ÿ§  ,   ^   ^
☻ $ 8 C : \ W i n d o w s \ W i n S x s \ N´&→∟☺ D d☺ `☻ ☺ ║q2¾─♥ J ►♦ ▲♥ ☻ [IY-0 2 d ♥ ♥ ═Û╬2d
  B   ¿
^ @♫ h♥ ♣ D♣(▒¿◄ V ↕ ÿ♥ ♠ M i c r o s o f t . W i n d o w s . S y s t e m C o m p a t i b l e l ☺ ♀☺ ð☺ ☻ , ▄☻ º¹Lí$♦╩☺☺

ETC. ETC......

Also, I think you should have extern(C) in the function definition.

I based the DLL on this how-to: http://dlang.org/dll.html

Reply via email to