在DLL中调用string

字体大小: 中小 标准 ->行高大小: 标准
调用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-不可以

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68682.html