对了,我在dll中创建窗体的函数老报错,语句是参考以前做的程序,怎么这里就不行了? function test:string;stdcall; begin try inherited; frmTEST := TfrmTEST.Create(self); frmTEST.ShowModal; finally frmTEST.Free; end; Result := frmTEST.str; end;错误提示如下: inherited这里的错误是:[Error] Pub.dpr(116): This form of method call only allowed in methods of derived types frmTEST := TfrmTEST.Create(self)这里也有错误: [Error] Pub.dpr(117): Undeclared identifier: 'self'frmTEST是我创建的窗体名
function test:string;stdcall;
begin
try
inherited;
frmTEST := TfrmTEST.Create(self);
frmTEST.ShowModal;
finally
frmTEST.Free;
end;
Result := frmTEST.str;
end;错误提示如下:
inherited这里的错误是:[Error] Pub.dpr(116): This form of method call only allowed in methods of derived types
frmTEST := TfrmTEST.Create(self)这里也有错误:
[Error] Pub.dpr(117): Undeclared identifier: 'self'frmTEST是我创建的窗体名
改为 frmTEST := Tform.Create(self);
1.函数返回string类型时:
动态库工程引用的第一个单元必须是sharemem;
应用程序工程文件中第一个引用单元必须是sharemem;
发布应用程序时,必须把borlandmem.dll一起发布;
建议:使用字符串指针类(PChar)型作为返回类型;PCHAR是WINDOWS的标准数据类型。2.代码中存在的问题:
function test:string;stdcall;
begin
try
inherited;//这一句没有必要要了。
//frmTEST := TfrmTEST.Create(self);//DLL工程与一般的窗体类型的工程不一样,
//没有SELF指针,DLL只有一个APPLICATION对象,且与调用的应用程序的APPLICATION对象
//是不一样的。在创建动态窗体时,你可以使用NIL就行了。
frmTEST := TfrmTEST.Create(nil);
if frmTEST.ShowModal=mrok then
Result := frmTEST.str;//函数返回的控制应当放在这儿。
//放在最后肯定会报内存访问错的。因为try finally end 结构中,会先释放窗体,再访问窗体对象时,这个对象不存在了!
finally
frmTEST.Free;
end;
end;
if frmTEST.ShowModal=mrok then中的mrok,系统说没有定义,是不是在uses的地方需要引用哪个单元?