解决方案 »
- 从Excel导入到SQL的问题!
- 急!!明天要交任务了,定时自动生成HTML!
- socketconnection问题,请各位帮帮忙。
- 关于网上文件下载问题请教各位大侠:如何将网上的某个文件自动下载保存到应用程序运行时所在的位置
- 有高手能让下面的语句写的更精练一点呢??
- 串口通讯使用MSCOMM控件,下送数据80(16进制)以上接收到的数据为零,而在VB中确可以接收到正确的80以上的数据,请高手指教。
- stringGrid中怎样获取当前选中单元的行索引和列索引????(在线等待)
- 一个简单的问题!!
- ==如何用Insert语句直接向Oracle的表中插入jpg文件??===
- Delphi的入门真的很难吗?
- array of char赋值给string的问题
- 在界面上添加fastreport4.0报表出错,谁能帮忙看看,困扰几天了
FDLLList.Add(sName+'='+IntToStr(h));FreeLibrary(StrToInt(FDllList.Strings[i]); 首先这里StrToInt肯定要出错
因为FDllList.Strings[i]并不是一个整数第二个
@obj:= GetProcAddress(h, 'TestObj');
GetProcAddress只返回函数地址,并不是函数执行结果
因此应该是
Type
TTestObj = Function:ITest;stdcall; //此函数为DLL导出函数,所有DLL都提供
var
P : TTestObj;
begin
....
P := GetProcAddress(h, 'TestObj');
if Assigned(P) then begin
Obj := P();
if Obj<>NIL then
...
end;
for i := FDllList.Count-1 downto 0 do
begin
FreeLibrary(StrToInt(FDllList.Strings[i]); //这里会报错
FDllList.Delete(i); //这句完全多余
end;
FDllList.Free;
FreeLibrary(StrToInt(FDllList.Strings[i]);
实际代码为
FreeLibrary(StrToInt(FDllList.Values[FDllList.Names[i]]));//这里会报错to kiboisme:
我先按照你的建议去修改下试试。
SearchFile(sPath,'*.dll',FileList);
if FileList.Count > 0 then
for i := 0 to FileList.Count-1 do
begin
h := loadlibrary(PChar(FileList.Strings[i]));///1、h 在此处为 dll的句柄
if h >0 then
begin
@obj:= GetProcAddress(h, 'TestObj');//2、h 在此处变为 函数的句柄
if @obj <> nil then
begin
sName := ExtractFileName(FileList.Strings[i]);
// DLLName = DLLHandle
FDLLList.Add(sName+'='+IntToStr(h));//添加的是函数的句柄
obj.GetVersion(sVersion);
end
else
FreeLibrary(h);
end;
end;
最后的地方
FreeLibrary(StrToInt(FDllList.Strings[i]); //你应该是想释放dll的句柄,但是根据你的代码是释放的函数的句柄建议把1跟2处不要用同一个参数,会更容易理解些
LPCSTR lpProcName // name of function
);
楼上的兄弟,我的代码里 h 一直是DLL句柄
你的对象以接口形式给别人用.当别人用完引用计数变成0的时候你对象就会被释放. FreeAndNil(FTestServer);就重复释放了,当然会报错.