delphi里dll中pchar的问题!帮帮忙! 30

我将一个邮件发送程序打包成DLL,DLL中的程序大概如下:proceduresendmail(str1,str2:PChar);varPm:TMailSendQueue;... 我将一个邮件发送程序打包成DLL,DLL中的程序大概如下:
procedure sendmail(str1 , str2 : PChar);

var
Pm: TMailSendQueue;
sm: TSendMailThread;

begin

Pm.Topic := str1 ; //邮件标题
Pm.Content := str2 ;//邮件正文

end ;
exports
sendmail ;

调用的程序如下:
procedure sendmail(str1 , str2 : PChar); stdcall ; external 'Project2.dll' ;

procedure TForm1.btn1Click(Sender: TObject);
var
text1 , text2 : PChar ;

begin
text1 := PChar ('see') ;
text2 := PChar ('see?') ;

sendmail(text1 , Text2);

end;

大概就是这样,按键按下的时候就调用sendmail,在发送过程一切正常,邮件也可以发送出去,邮箱也可收到,但在发送之后就会弹出一个系统的错误提示框出来,我觉得是这里面的PCHAR传参出现了问题,网上查了下,好像在DLL那边要分配下PCHAR的大小什么的,但看不太明白,请各位教我!

Pm.Topic := str1 ; //标题
Pm.Content := str2 ;//正文
。。。。。以下省略不必要的
另,不想用sharemem string 的法子,那样不好
展开
 我来答
billswhot
2010-07-07 · TA获得超过1015个赞
知道小有建树答主
回答量:1182
采纳率:0%
帮助的人:670万
展开全部
在DELPHI中编写DLL时,如果DLL有创建ADO对象要被调用函数开始处写:CoInitialize(nil);
结束时写:CoUninitialize;
如要返回字符串贺巧伏要用PChar,最好用PChar用out或var方式返回,PChar的内存分配和释放在调用函数处理:GetMem(p, Size); FreeMem(p);

procedure CommonDLL(AHnd: THandle; //AApp: TApplication;
ADllFileName: PChar;
AConnStr: PChar; AUserID: integer; ABillTypeID: integer);
var
LPtr:PLongint;
strCon: widestring;
strDllFileName: string;
begin
CoInitialize(nil);
strCon := StrPas(AConnstr);
strDllFileName := StrPas(ADllFileName);
try
Application.Handle := AHnd;
Screen := AScr;
LPtr := @Application.MainForm;
LPtr^ := Longint(AApp.MainForm);

finally
end;
CoUninitialize;
end;

function StrPas(const Str: PChar): string;
begin
Result := Str;
end;

function StrAlloc(Size: Cardinal): PChar;
begin
Inc(Size, SizeOf(Cardinal));
GetMem(Result, Size);
Cardinal(Pointer(Result)^) := Size;
Inc(Result, SizeOf(Cardinal));
end;

function StrBufSize(const Str: PChar): Cardinal;
var
P: PChar;
begin
P := Str;
Dec(P, SizeOf(Cardinal));
Result := Cardinal(Pointer(P)^) - SizeOf(Cardinal);
end;

function StrNew(const Str: PChar): PChar;
var
Size: Cardinal;
begin
if Str = nil then Result := nil else
begin
Size := StrLen(Str) + 1;
Result := StrMove(StrAlloc(Size), Str, Size);
end;
end;

看清楚了吗Pchar只是个指针,你在禅携返回一个字符串的时候才需要分配内存,上面那几个函数都是用于宽埋分配内存给一个新的字符串用的!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式