关于dll中参数传递的问题(200)(200分)

G

goujie

Unregistered / Unconfirmed
GUEST, unregistred user!
在我的dll中有个函数她有三个参数,其中两个是传入参数(Const Com:Integer;Const WriteString:pChar;),
一个是输出参数(Var ReturnString:pChar),但是我在调用的时候输出参数的值不正确:函数如下:
unit UitMain;
interface
uses
Windows,SysUtils,StdCtrls;
Function SendSMSMessage(Const Com:Integer;Const WriteString:pChar;
Var ReturnString:pChar):Boolean;far;StdCall;
implementation
Function SendSMSMessage(Const Com:Integer;Const WriteString:pChar;
Var ReturnString:pChar):Boolean;
begin
ReturnString:=PChar('AAAAAAAA');
Result:=True;
end;
调用如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var aa:pchar;
straa:string;
begin
getmem(aa,1024);
SendSMSMessage(2,PCHAR('ATD 13701192708'+#13),aa);
straa:=string(aa);
freemem(aa);
showmessage(straa);
end;
end.
申明如下:
unit Unit2;
interface
Function SendSMSMessage(Com:Integer;WriteString:pChar;ReturnString:pchar):Boolean;StdCall;
implementation
Function SendSMSMessage(Com:Integer;WriteString:pChar;ReturnString:pchar):Boolean;external 'SmsSenderdll.dll' name 'SendSMSMessage';
end.
 
procedure TForm1.Button1Click(Sender: TObject);
Var aa:pchar;
straa:string;
begin
getmem(aa,1024);
SendSMSMessage(2,PCHAR('ATD 13701192708'+#13),aa);
straa:=strpas(aa)
////////
freemem(aa);
showmessage(straa);
end;
 
我已经跟踪了返回到AA中的值就不正确!
 
Function SendSMSMessage(Const Com:Integer;Const WriteString:pChar;
Var ReturnString:pChar):Boolean;
var
S: String;
begin
S := 'AAAAAAAA';
StrPLCopy(ReturnString,S,Length(S)):
Result:=True;
end;

注意,S的长度要<=getmem(aa,1024);分配的空间。

 
改成Kkyy那样后程序包错::write of address 40020d8c;
 
不好意思, 刚才没仔细看. 实际上, 你调用时PChar('...') 是一个常量, 他临时放在
栈中, 所以当函数返回时他已经不存在了, 所以, 尽管你保存了他的地址并返回, 可是
地址所指向的内容已经无效了.

Function SendSMSMessage(Const Com:Integer;Const WriteString:pChar;
Var ReturnString:pChar):Boolean;
var
S: String;
begin
S := 'AAAAAAAA';
StrCopy(ReturnString, PChar(S));
Result:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var aa:pchar;
straa:string;
begin
getmem(aa,1024);
SendSMSMessage(2,PCHAR('ATD 13701192708'+#13),aa);
straa:=StrPas(aa);
freemem(aa);
showmessage(straa);
end;

 
多人接受答案了。
 
我的怎么会包错呢?呵呵,我做了好多年程序,一向都是这么干的啊。
 

谢谢各位,我找到了原因,是因为在函数申明的时候,在传出参数前面加了 var ,
一去掉就可以了。
 
顶部