win2000下动态链接库的问题?在win98下运行正常。(100分)

  • 主题发起人 主题发起人 ghbh
  • 开始时间 开始时间
G

ghbh

Unregistered / Unconfirmed
GUEST, unregistred user!
动态链接库:
library Project1;
uses
ShareMem,
SysUtils,
Classes;

{$R *.res}

function aa(a, b: integer):integer;stdcall;
begin
Result := a + b;
end;
exports aa name 'aa';
begin
end.

调用
procedure TForm1.Button1Click(Sender: TObject);
var aa:function(a,b:integer):integer;stdcall;
hlib:THandle;
b:integer;
begin
hlib := LoadLibrary('Project1.dll');
@aa := GetProcAddress(hlib,'aa');
b := aa(1,2);
Showmessage(IntToStr(b));
FreeLibrary(hlib);
end;

调用完执行FreeLibrary(hlib)后出现内存错误。在win98下运行正常。为什么?
 
因为你的dll中使用了sharemem
使用你的工程文件中的第一个位置也要引用sharemem

program Project2;

uses
sharemem,<<<注意这儿
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

或者在dll中删除sharemem也可
 
在工程文件中的第一个位置引用sharemem可以。
但是仅在dll中删除sharemem不行。为什么??
52free能否讲一下为什么在win2000下不行,而win98下可以。

 
加入ShareMem单元
只是对Delphi中的ansistring类型在Dll中的内存管理方式.
发布是必须代Borlandmm.dll
 
删除sharemem应该是可行的
因为就你的dll只是使用了integer类型,并没有使用类似于string这种自动内存管理的类型
所以没有必要使用sharemem。

正常情况下win2000和win98中使用这种dll不会出现你说的这种情况
如果你的情况确实不正常的话,使用sharemem后检查一下系统目录下有没有borlandmm.dll这个文件,大概是这个名字记不太清了,可能有一定的关系
 
多人接受答案了。
 
后退
顶部