一个关于pchar的问题:如何调用用C编写的字符串转换DLL(100分)

  • 主题发起人 主题发起人 abc2003
  • 开始时间 开始时间
A

abc2003

Unregistered / Unconfirmed
GUEST, unregistred user!
我用C编写的一个字符串转换DLL
函数声明为
void ConvertString(char * StrIn,char * StrOut)
StrOut的长度不会超过StrIn的长度
我在Delphi是如下调用的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Edit4: TEdit;
Edit5: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure stringcrypt(datain,dataout:PChar);far external 'String.dll';
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var StrIn,StrOut: string;
begin
StrOut := ' ';
StrIn := edit1.Text;
stringcrypt(PChar(StrIn),PChar(StrOut));
edit2.Text := str;
end;

end.

但总是报 Access violation的错。
是不是我的参数声明有错。或者是要为StrOut分配内存。
 
别偷懒,还是把string全部定义成pchar类型吧!
 
检查:
1.dll 调用是不是 stdcall
2.stdout不够长
 
to cAkk:
那么怎么为PChar分配内存呢?
 
难道你调用的时候不知道长度??
 
ConvertString(char * StrIn,char * StrOut)的两个参数是指针,而Pchar()返
回常量,应该用PChar类型的变量做参数。
 
当然知道,但怎么在Delphi写代码,如为PChar分配100字节的空间。
不能用new吧?
 
在stringcrypt中进行了什么处理?
你先试试在stringcrypt中只用strcpy自制一下。
 
在stringcrypt中是把StrIn转化为另一个等长度的字符串StrOut
 
getmem(变量,100);
//分配
freemem(变量);
//释放
 
PChar(PASCALString)能同时完成把Pascal的String型变量
转换成以null结尾的字符串又完成把地址赋值给形参的工作?
我总觉得你这样写会使得你C编的DLL程序取不到字符串的长度,
因而可能会产生地址越界的情况。如果是这样的话,在你的dll
中设置一个显示消息的调试语句一试便知。
 
procedure TForm1.Button1Click(Sender: TObject);
var
StrIn: string;
StrOut: pchar;
begin
getmem(strout,255);
StrIn := edit1.Text;
stringcrypt(PChar(StrIn),StrOut);
edit2.Text := strpas(strout);
end;
 
这样理解:
PChar(string)只是临时把string的<font color=red>内容</font>作为pchar类型传递了过去,但实际上
string还是string,并没有变成pchar,所以当需要把结果传递回来时,因为
string不是一个指针,所以出错.
(我瞎猜的)
 
对了, 最后要加
freemem(strout);
 
太晕了,没加Stdcall;//faint
接受答案!
 
多人接受答案了。
 

Similar threads

后退
顶部