关于DELPHI中使用LoadLibrary导入DLL的问题

时间:2021-03-09 08:44:13
用C++编写了一个DLL(SpcClass.dll),其中定义一个接口函数:

extern "C" int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);

用DELPHI调用该DLL文件,然后访问接口函数

编译好的DLL文件放到system32中

DELPHI中的代码如下:

type                                
  TAnalysis = function(MyList:TStringList):Integer;stdcall;
...

procedure TAO_QualitySPC.cxButton1Click(Sender: TObject);
var
  LibHandle: THandle;
  Analysis: TAnalysis;
  MyList: TStringList;
begin
  inherited;
  MyList := TStringList.Create;
  LibHandle := LoadLibrary('c:\\windows\\system32\\SpcClass.dll');
  @Analysis := GetProcAddress(LibHandle,'Analysis');
  Analysis(MyList);
end;
...

现在的问题是:每次运行后,句柄LibHandle返回值都是0,导致无法继续,查了很多资料都不知道问题出在哪里,来求助大家了

32 个解决方案

#1


c:\\windows\\system32\\SpcClass.dll  不用双斜线的吧?

#2


用GetLastError看看

#3


引用 1 楼 zshsuming 的回复:
c:\\windows\\system32\\SpcClass.dll 不用双斜线的吧?


单斜线也不行,放在工程目录中不给绝对路径也不行,在OPTIONS中指定路径也不行,总之就是找不到

#4


MSDN:
If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL

你用GetLastError看看返回多少?

#5


LibHandle := LoadLibrary('c:\\windows\\system32\\SpcClass.dll');delphi不用双斜杠

#6


TAnalysis = function(MyList:TStringList):Integer;stdcall;


int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);


这两个stringlist不一样  动态库里传对象?

不现实,C++那边修改代码 传字符串

还有 *MyList 是传址吧  应该function(var MyList:TStringList):Integer;stdcall;

#7


LoadLibrary('c:\\windows\\system32\\SpcClass.dll')

还有 单斜杠

#8


引用 5 楼 bdmh 的回复:
LibHandle := LoadLibrary('c:\\windows\\system32\\SpcClass.dll');delphi不用双斜杠


这个修改了,多谢,但句柄还是为0

#9


delphi里面的TStringList不是你C++里面的那个TStringList

#10


引用 6 楼 jiap1723 的回复:
TAnalysis = function(MyList:TStringList):Integer;stdcall;


int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);


这两个stringlist不一样 动态库里传对象?

不现实,C++那边修改代码 传字符串

还有 *MyList 是传址……


本意是需要在DELPHI中得到一个不定长的数组,通过接口函数传到DLL中进行计算,因为C++和DELPHI中都有TStringList这个类型,所以这么选择

以前本来想用DLL做一个导出类,在DELPHI中使用,但后来发现不行,所以才做成导出函数,传数据

关于您回复的,能说的再具体些吗,多谢

#11


引用 9 楼 hongqi162 的回复:
delphi里面的TStringList不是你C++里面的那个TStringList


因为要传入不定长的数组,所以才这样选择,如果需求不能变,该如何修改呢,求指教

#12


程序运行到Analysis(MyList)

会报错,信息:Access violation at address 00000000, read of address 00000000,

#13


不太清楚 C++那边是什么样子

不过 你数组也可以转成字符串吧  

#14


我现在感觉这个DLL都没有被加载进来

#15


只要你路径没问题 函数百分之百加载上来了

#16


引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


那看来就是函数本身的问题了

#17


引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

#18


引用 17 楼 arika 的回复:
引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

返回0,肯定是没加载成功了,GetLastError返回是什么

#19


LoadLibrary  返回本身就有点歧义  返回值这个问题上不用花费太长时间了

没报错就行



#20


Long,成功则返回库模块的句柄,零表示失败 

函数说明是这样子的

#21


DLL加载和函数能不能成功使用是两个概念,要先加载DLL文件,才能谈下一步的函数调用

#22


引用 18 楼 m617105 的回复:
引用 17 楼 arika 的回复:

引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

返回0,肯定是没加载成功了,GetLastError返回是什么



LibHandle := LoadLibrary('c:\windows\system32\SpcClass.dll');
  ShowMessage(SysErrorMessage(GetLastError));

这样用对吗

提示找不到指定模块

#23


引用 22 楼 arika 的回复:
引用 18 楼 m617105 的回复:
引用 17 楼 arika 的回复:

引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

返回0,肯定是没加载成功了,GetLastError返回是什么



LibHandle := LoadLibrary('c:\windows\s……

提示的很明显,没找到SpcClass.dll

#24


DLL里调用了其他API 或者 DLL没 

可能是你DLL里的代码引起的

#25


在开始-》运行里输入c:\windows\system32\SpcClass.dll
看有什么反应。确认文件存在么?别告诉我文件名错了
如果文件不存在,那系统会弹出警告:Windows 找不到文件 'c:\windows\system32\SpcClass.dll'。请确定文件名是否正确后,再试一次。要搜索文件,请单击「开始」按钮,然后单击“搜索”

#26


引用 24 楼 jiap1723 的回复:
DLL里调用了其他API 或者 DLL没 

可能是你DLL里的代码引起的


恩,你说的可能是对的,应该是DLL本身的问题


多谢大家的热心回复,我再去查下DLL吧

#27


你可以用工具看看这个函数有没有接口

#28


这个这个.....

#29


引用 27 楼 gyk120 的回复:
你可以用工具看看这个函数有没有接口


现在还是DLL无法加载上来,随机找了一个WINDOWS的DLL,加载没问题

以前也用CB写过一个DLL,用DELPHI调用,当时没问题,现在找来这个DLL,用同样方法调用,没问题

用BCB新建立一个DLL文件,不写任何代码,编译出来的DLL同样无法加载

现在判断,还是问题出在DLL文件本身

#30


引用 29 楼 arika 的回复:
引用 27 楼 gyk120 的回复:
你可以用工具看看这个函数有没有接口


现在还是DLL无法加载上来,随机找了一个WINDOWS的DLL,加载没问题

以前也用CB写过一个DLL,用DELPHI调用,当时没问题,现在找来这个DLL,用同样方法调用,没问题

用BCB新建立一个DLL文件,不写任何代码,编译出来的DLL同样无法加载

现在判断,还是问题出在DLL文件本身
……

关于LoadLibrary的注意事项,MSDN上说的很清楚,什么时候加载失败。

#31


还要多少人提示你看看GetLastError呢??

#32


引用 31 楼 sonicer 的回复:
还要多少人提示你看看GetLastError呢??


看过了,无法找到指定模块

#1


c:\\windows\\system32\\SpcClass.dll  不用双斜线的吧?

#2


用GetLastError看看

#3


引用 1 楼 zshsuming 的回复:
c:\\windows\\system32\\SpcClass.dll 不用双斜线的吧?


单斜线也不行,放在工程目录中不给绝对路径也不行,在OPTIONS中指定路径也不行,总之就是找不到

#4


MSDN:
If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL

你用GetLastError看看返回多少?

#5


LibHandle := LoadLibrary('c:\\windows\\system32\\SpcClass.dll');delphi不用双斜杠

#6


TAnalysis = function(MyList:TStringList):Integer;stdcall;


int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);


这两个stringlist不一样  动态库里传对象?

不现实,C++那边修改代码 传字符串

还有 *MyList 是传址吧  应该function(var MyList:TStringList):Integer;stdcall;

#7


LoadLibrary('c:\\windows\\system32\\SpcClass.dll')

还有 单斜杠

#8


引用 5 楼 bdmh 的回复:
LibHandle := LoadLibrary('c:\\windows\\system32\\SpcClass.dll');delphi不用双斜杠


这个修改了,多谢,但句柄还是为0

#9


delphi里面的TStringList不是你C++里面的那个TStringList

#10


引用 6 楼 jiap1723 的回复:
TAnalysis = function(MyList:TStringList):Integer;stdcall;


int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);


这两个stringlist不一样 动态库里传对象?

不现实,C++那边修改代码 传字符串

还有 *MyList 是传址……


本意是需要在DELPHI中得到一个不定长的数组,通过接口函数传到DLL中进行计算,因为C++和DELPHI中都有TStringList这个类型,所以这么选择

以前本来想用DLL做一个导出类,在DELPHI中使用,但后来发现不行,所以才做成导出函数,传数据

关于您回复的,能说的再具体些吗,多谢

#11


引用 9 楼 hongqi162 的回复:
delphi里面的TStringList不是你C++里面的那个TStringList


因为要传入不定长的数组,所以才这样选择,如果需求不能变,该如何修改呢,求指教

#12


程序运行到Analysis(MyList)

会报错,信息:Access violation at address 00000000, read of address 00000000,

#13


不太清楚 C++那边是什么样子

不过 你数组也可以转成字符串吧  

#14


我现在感觉这个DLL都没有被加载进来

#15


只要你路径没问题 函数百分之百加载上来了

#16


引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


那看来就是函数本身的问题了

#17


引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

#18


引用 17 楼 arika 的回复:
引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

返回0,肯定是没加载成功了,GetLastError返回是什么

#19


LoadLibrary  返回本身就有点歧义  返回值这个问题上不用花费太长时间了

没报错就行



#20


Long,成功则返回库模块的句柄,零表示失败 

函数说明是这样子的

#21


DLL加载和函数能不能成功使用是两个概念,要先加载DLL文件,才能谈下一步的函数调用

#22


引用 18 楼 m617105 的回复:
引用 17 楼 arika 的回复:

引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

返回0,肯定是没加载成功了,GetLastError返回是什么



LibHandle := LoadLibrary('c:\windows\system32\SpcClass.dll');
  ShowMessage(SysErrorMessage(GetLastError));

这样用对吗

提示找不到指定模块

#23


引用 22 楼 arika 的回复:
引用 18 楼 m617105 的回复:
引用 17 楼 arika 的回复:

引用 15 楼 jiap1723 的回复:
只要你路径没问题 函数百分之百加载上来了


但我看句柄的值始终都是0啊,这也能表示加载成功了吗

返回0,肯定是没加载成功了,GetLastError返回是什么



LibHandle := LoadLibrary('c:\windows\s……

提示的很明显,没找到SpcClass.dll

#24


DLL里调用了其他API 或者 DLL没 

可能是你DLL里的代码引起的

#25


在开始-》运行里输入c:\windows\system32\SpcClass.dll
看有什么反应。确认文件存在么?别告诉我文件名错了
如果文件不存在,那系统会弹出警告:Windows 找不到文件 'c:\windows\system32\SpcClass.dll'。请确定文件名是否正确后,再试一次。要搜索文件,请单击「开始」按钮,然后单击“搜索”

#26


引用 24 楼 jiap1723 的回复:
DLL里调用了其他API 或者 DLL没 

可能是你DLL里的代码引起的


恩,你说的可能是对的,应该是DLL本身的问题


多谢大家的热心回复,我再去查下DLL吧

#27


你可以用工具看看这个函数有没有接口

#28


这个这个.....

#29


引用 27 楼 gyk120 的回复:
你可以用工具看看这个函数有没有接口


现在还是DLL无法加载上来,随机找了一个WINDOWS的DLL,加载没问题

以前也用CB写过一个DLL,用DELPHI调用,当时没问题,现在找来这个DLL,用同样方法调用,没问题

用BCB新建立一个DLL文件,不写任何代码,编译出来的DLL同样无法加载

现在判断,还是问题出在DLL文件本身

#30


引用 29 楼 arika 的回复:
引用 27 楼 gyk120 的回复:
你可以用工具看看这个函数有没有接口


现在还是DLL无法加载上来,随机找了一个WINDOWS的DLL,加载没问题

以前也用CB写过一个DLL,用DELPHI调用,当时没问题,现在找来这个DLL,用同样方法调用,没问题

用BCB新建立一个DLL文件,不写任何代码,编译出来的DLL同样无法加载

现在判断,还是问题出在DLL文件本身
……

关于LoadLibrary的注意事项,MSDN上说的很清楚,什么时候加载失败。

#31


还要多少人提示你看看GetLastError呢??

#32


引用 31 楼 sonicer 的回复:
还要多少人提示你看看GetLastError呢??


看过了,无法找到指定模块