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 的法子,那样不好 展开
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 的法子,那样不好 展开
1个回答
展开全部
在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只是个指针,你在返回一个字符串的时候才需要分配内存,上面那几个函数都是用于分配内存给一个新的字符串用的!
结束时写: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只是个指针,你在返回一个字符串的时候才需要分配内存,上面那几个函数都是用于分配内存给一个新的字符串用的!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询