home bbs files messages ]

Just a sample of the Echomail archive

Cooperative anarchy at its finest, still active today. Darkrealms is the Zone 1 Hub.

   PASCAL      Pascal programming language discussions      592 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 505 of 592   
   Alexander Grotewohl to Andy Gorman   
   Re: "Delphi" DLL   
   08 May 21 20:02:46   
   
   TID: Mystic BBS 1.12 A47   
   MSGID: 1:120/616 cac7bd24   
   REPLY: 1:229/426.52 801c7496   
   TZUTC: -0400   
   On 08 May 2021, Andy Gorman said the following...   
       
    AG> I'm creating a DLL that is going to get a value passed into it (path to a   
    AG> file).  I am able to pass in a value, but it's getting truncted in the   
    AG> DLL.   
    AG>    
    AG> Here's the code:   
    AG>    
    AG> library SimpleLib;   
    AG>    
    AG> Uses   
    AG>         SysUtils;   
    AG>    
    AG> Var   
    AG>   Path : String;   
    AG>   o : Text;   
    AG>    
    AG> function MySucc(AVal : PWideString;  pLen : Integer) : PWideString;   
    AG> stdcall; begin   
    AG>   SetLength(String(AVal), pLen);   
    AG>   Assign(o, 'c:\temp\simp.txt');   
    AG>   Rewrite(o);   
    AG>   Write(o,String(AVal));   
    AG>   Close(o);   
    AG>   Result := AVal;   
    AG> end;   
    AG>    
    AG> exports   
    AG>   MySucc;   
    AG> End.   
      
   are you calling this from C# then? it would seem SetLength() is doing   
   something to a pointer that is not technically a 'PWideString'. (a PWideString   
   has a known length, see https://wiki.freepascal.org/Character_and_string_types)   
      
   String() on the other hand (depending on compiler settings) would force AVal   
   to a old pascal style string where string[0] is a byte for the length. so if   
   the length is stored in memory at str[-1] and str[0] (this is not something   
   you'd normally interact with.. these are managed types and the compiler   
   handles this), you're only getting one byte of the length.   
      
   is there a reason you're using PWideString? SysUtils has a StrPas function   
   that makes it fairly easy to do things like UnicodeStringVar:=StrPas(AVal);   
   where AVal is a PWideChar .. which is usually enough for me to interact with   
   C/C++ from pascal.    
      
   sorry for the lack of code.. but i'd be unable to test it if it's called from   
   other than pascal ;) but hopefully it's enough   
      
   --- Mystic BBS v1.12 A47 2021/04/20 (Windows/32)   
    * Origin: cold fusion - cfbbs.net - grand rapids, mi (1:120/616)   
   SEEN-BY: 1/123 90/1 103/705 120/340 457 616 123/10 131 124/5016 129/305   
   SEEN-BY: 154/10 30 40 50 700 203/0 220/80 90 221/0 6 226/30 227/114   
   SEEN-BY: 227/201 702 229/101 424 426 550 616 664 700 1016 1017 240/5138   
   SEEN-BY: 240/5411 5832 5853 249/206 317 400 280/464 5003 282/1038   
   SEEN-BY: 292/854 8125 301/1 317/3 320/219 322/757 342/200 396/45 423/120   
   SEEN-BY: 712/848 770/1 2432/390 2454/119 3634/12   
   PATH: 120/616 154/10 280/464 240/5832 229/426   
      

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca