调用DLL中的对象的方法返回值为string时报错!!!!
问题:
对象TDllNumber在objdll.dll中定义:
objdll.dll输出一个函数:CreateObject
type
TDllNumber=class
public
function GetOk:string;virtual;abstract;
end;
TDllNumber1=class(TDllNumber)
public
constructor create;
function GetOk:string;override;
end;
function CreateObject:TDllNumber;export;
implementation
constructor TDllNumber1.create;
begin
inherited create;
end;
function TDllNumber1.GetOk: string;
begin
result:='ok';
end;
function CreateObject:TDllNumber;
begin
Result:=TDllNumber1.Create;
end;
在程序中调用对象:
type
TDllNumber=class
public
function GetOk:string;virtual;abstract;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function CreateObject:TDllNumber;stdcall;external 'objdll.dll';
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Ok:string;
TestObj:TDllNumber;
begin
TestObj:=CreateObject;
Ok:=TestObj.GetOk;
ShowMessage(ok);
TestObj.Free;
end;
当程序运行到button1click最后是包错:
Invalid pointer Operation!!!
但是为integer,pchar不报错!!!!
总结:
1。 在dll中定义返回string字符串的函数时,如果没有特殊处理调用该函数
在退出调用该函数的过程(函数/事件)时,会出现以下错误:
Invalid Pointer Operator!
2。当在单元中添加ShareMem时,在退出程序的时候会出现同样的错误
3。当在调用dll的项目文件中(不是在单元文件)添加ShareMem时,能够正常
运行.
4. String类型是Borland自定的特殊类型,使用起来真是无比方便,
但是,它需要borladmm.dll的支持,在动态链接库中想使用STRING类型
要经过特殊的手段,因此还是使用PCHAR类型吧。PCHAR也挺方便的。
另外如果没有特殊处理的话: WideString-可以
AnsiString-不可以