请问如何在delphi里面实现c语言中的双重指针? ( 积分: 50 )

  • 主题发起人 主题发起人 头版头条
  • 开始时间 开始时间

头版头条

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何在delphi里面实现c语言中的双重指针?<br><br>c语言定义dll文件,里面有这个函数mySum:<br><br>LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),&quot;%s&quot;,a); return *b;} <br><br><br>如何在dephi中定义这个函数呢,主要是char **b这个双重指针的定义,我要在其他语言中调用这个函数,不是在delphi开发的应用程序中调用这个dll中的函数。
 
请问如何在delphi里面实现c语言中的双重指针?<br><br>c语言定义dll文件,里面有这个函数mySum:<br><br>LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),&quot;%s&quot;,a); return *b;} <br><br><br>如何在dephi中定义这个函数呢,主要是char **b这个双重指针的定义,我要在其他语言中调用这个函数,不是在delphi开发的应用程序中调用这个dll中的函数。
 
char * -&gt; PChar;<br>char ** -&gt; PPChar;
 
请问我要用的字符串是unicode的,不是ansi的。如何实现呢?<br>ppchar是ansi的。<br>什么是表示unicode呢,我知道有pwidestring,可是没有ppwidestring这个类型的变量
 
自已定义一个不就是了,很简单的<br>type<br> &nbsp;PPWideString = ^PWideString;
 
那怎么给这个类型的变量赋值呢。<br>比如<br>type<br> &nbsp;ppwidestring=^pwidestring;<br>function (a:widestring;b:ppwidestring):wdestring;<br>begin<br> &nbsp;在这里实现a+b,并返回a+b的结果<br>end;
 
function (a:widestring; var b:pwidestring):wdestring;<br>begin<br> &nbsp;在这里实现a+b,并返回a+b的结果<br>end; &nbsp;<br><br>如果是这样:<br>function (a:widestring;b:ppwidestring):wdestring;<br>begin<br> &nbsp;在这里实现a+b,并返回a+b的结果<br> &nbsp;Result := a + b^;<br>end;
 
按照你上面的代码无法编译:<br>我得文件是这么写的<br>unit Unit1;<br><br>interface<br>uses<br> &nbsp;windows,sysutils,stdctrls,classes;<br>type<br> &nbsp;ppwidestring=^pwidestring;<br><br>function add(a:widestring; b:ppwidestring):wordbool;stdcall;export;<br><br>implementation<br><br>function add(a:widestring; b:ppwidestring):wordbool;<br>begin<br> &nbsp; result:=true;<br> &nbsp; try<br> &nbsp; &nbsp; b^^:=a+b^^;<br> &nbsp; except<br> &nbsp; &nbsp; result:=false;<br> &nbsp; end;<br>end;<br>end.<br> 可是,就连delphi的exe都无法调用这个dll中的函数了。我的qq:315360007,希望你能加我,我和你进一步聊,我想用c#调用这样的函数。希望楼上的朋友能帮我解决这个问题。
 
Delphi 中的字符串使用了自己的内存管理,<br>不应直接传递这些对象, 只能传递指针,<br>或通过输出缓冲区来返回数据,<br>可以参照 Windows API 的接口方法
 
不明白楼上的朋友的意思?<br>能写的具体电吗?<br>定义的部分,和调用的部分。我想和你语聊,因为我这边要用c#调用。
 
Delphi的WideString不是生存期自管理的,你可以在DLL使用来传递参数<br>但是,String是生存期管理的,你不能直接在DLL用它来传递参数<br>一般的,如果你想在其他语言中传递字符串,最好用PChar,传递一个<br>PChar类型的缓冲区和缓冲区长度,Win API一般都这样做<br>function xxx(buf: PChar; len: Integer): Integer;
 
function Add(dest: PWideString; src: PWideString): Integer;<br>var<br> &nbsp;t: WideString;<br> &nbsp;n: Integer;<br>begin<br> &nbsp;t := dest;<br> &nbsp;n := WideFormatBuf(dest^, 1024, '%s%s', 4, [t, src]);<br> &nbsp;dest[n] := WideChar(0);<br>end;
 
Char &nbsp; &nbsp;--&gt; &nbsp;WideChar<br> PChar &nbsp; --&gt; &nbsp;PWideChar<br> PPChar &nbsp;--&gt; &nbsp;PPWideChar
 
to tseug,<br>WideString 也是生存期自动管理的,和String 不同的是,<br>它没有采用引用计数来进行优化处理<br><br>下面的程序可以证明:<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;s: WideString;<br>begin<br> &nbsp;s := IntToStr(1);<br> &nbsp;ShowMessage(Format('%p', [Pointer(s)]));<br> &nbsp;s := IntToStr(2);<br> &nbsp;ShowMessage(Format('%p', [Pointer(s)]));<br> &nbsp;SetLength(s, 1024*1024*100);<br> &nbsp;ShowMessage(Format('%p', [Pointer(s)]));<br>end;<br><br>每次显示这个字符串的地址都不一样,<br>所占的200M内存也能自动释放,<br>难道不是生存期自动管理的?
 
呵呵,我说的不严谨,都是生存期自管理的,只不过WideString不是采用引用计数的
 
后退
顶部