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
单斜线也不行,放在工程目录中不给绝对路径也不行,在OPTIONS中指定路径也不行,总之就是找不到
#4
MSDN:
If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL
你用GetLastError看看返回多少?
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;
int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);
这两个stringlist不一样 动态库里传对象?
不现实,C++那边修改代码 传字符串
还有 *MyList 是传址吧 应该function(var MyList:TStringList):Integer;stdcall;
#7
LoadLibrary('c:\\windows\\system32\\SpcClass.dll')
还有 单斜杠
还有 单斜杠
#8
这个修改了,多谢,但句柄还是为0
#9
delphi里面的TStringList不是你C++里面的那个TStringList
#10
本意是需要在DELPHI中得到一个不定长的数组,通过接口函数传到DLL中进行计算,因为C++和DELPHI中都有TStringList这个类型,所以这么选择
以前本来想用DLL做一个导出类,在DELPHI中使用,但后来发现不行,所以才做成导出函数,传数据
关于您回复的,能说的再具体些吗,多谢
#11
因为要传入不定长的数组,所以才这样选择,如果需求不能变,该如何修改呢,求指教
#12
程序运行到Analysis(MyList)
会报错,信息:Access violation at address 00000000, read of address 00000000,
会报错,信息:Access violation at address 00000000, read of address 00000000,
#13
不太清楚 C++那边是什么样子
不过 你数组也可以转成字符串吧
不过 你数组也可以转成字符串吧
#14
我现在感觉这个DLL都没有被加载进来
#15
只要你路径没问题 函数百分之百加载上来了
#16
那看来就是函数本身的问题了
#17
但我看句柄的值始终都是0啊,这也能表示加载成功了吗
#18
返回0,肯定是没加载成功了,GetLastError返回是什么
#19
LoadLibrary 返回本身就有点歧义 返回值这个问题上不用花费太长时间了
没报错就行
没报错就行
#20
Long,成功则返回库模块的句柄,零表示失败
函数说明是这样子的
函数说明是这样子的
#21
DLL加载和函数能不能成功使用是两个概念,要先加载DLL文件,才能谈下一步的函数调用
#22
LibHandle := LoadLibrary('c:\windows\system32\SpcClass.dll');
ShowMessage(SysErrorMessage(GetLastError));
这样用对吗
提示找不到指定模块
#23
提示的很明显,没找到SpcClass.dll
#24
DLL里调用了其他API 或者 DLL没
可能是你DLL里的代码引起的
可能是你DLL里的代码引起的
#25
在开始-》运行里输入c:\windows\system32\SpcClass.dll
看有什么反应。确认文件存在么?别告诉我文件名错了
如果文件不存在,那系统会弹出警告:Windows 找不到文件 'c:\windows\system32\SpcClass.dll'。请确定文件名是否正确后,再试一次。要搜索文件,请单击「开始」按钮,然后单击“搜索”
。
看有什么反应。确认文件存在么?别告诉我文件名错了
如果文件不存在,那系统会弹出警告:Windows 找不到文件 'c:\windows\system32\SpcClass.dll'。请确定文件名是否正确后,再试一次。要搜索文件,请单击「开始」按钮,然后单击“搜索”
。
#26
恩,你说的可能是对的,应该是DLL本身的问题
多谢大家的热心回复,我再去查下DLL吧
#27
你可以用工具看看这个函数有没有接口
#28
这个这个.....
#29
现在还是DLL无法加载上来,随机找了一个WINDOWS的DLL,加载没问题
以前也用CB写过一个DLL,用DELPHI调用,当时没问题,现在找来这个DLL,用同样方法调用,没问题
用BCB新建立一个DLL文件,不写任何代码,编译出来的DLL同样无法加载
现在判断,还是问题出在DLL文件本身
#30
关于LoadLibrary的注意事项,MSDN上说的很清楚,什么时候加载失败。
#31
还要多少人提示你看看GetLastError呢??
#32
看过了,无法找到指定模块
#1
c:\\windows\\system32\\SpcClass.dll 不用双斜线的吧?
#2
用GetLastError看看
#3
单斜线也不行,放在工程目录中不给绝对路径也不行,在OPTIONS中指定路径也不行,总之就是找不到
#4
MSDN:
If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL
你用GetLastError看看返回多少?
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;
int __declspec(dllexport) __stdcall Analysis(TStringList *MyList);
这两个stringlist不一样 动态库里传对象?
不现实,C++那边修改代码 传字符串
还有 *MyList 是传址吧 应该function(var MyList:TStringList):Integer;stdcall;
#7
LoadLibrary('c:\\windows\\system32\\SpcClass.dll')
还有 单斜杠
还有 单斜杠
#8
这个修改了,多谢,但句柄还是为0
#9
delphi里面的TStringList不是你C++里面的那个TStringList
#10
本意是需要在DELPHI中得到一个不定长的数组,通过接口函数传到DLL中进行计算,因为C++和DELPHI中都有TStringList这个类型,所以这么选择
以前本来想用DLL做一个导出类,在DELPHI中使用,但后来发现不行,所以才做成导出函数,传数据
关于您回复的,能说的再具体些吗,多谢
#11
因为要传入不定长的数组,所以才这样选择,如果需求不能变,该如何修改呢,求指教
#12
程序运行到Analysis(MyList)
会报错,信息:Access violation at address 00000000, read of address 00000000,
会报错,信息:Access violation at address 00000000, read of address 00000000,
#13
不太清楚 C++那边是什么样子
不过 你数组也可以转成字符串吧
不过 你数组也可以转成字符串吧
#14
我现在感觉这个DLL都没有被加载进来
#15
只要你路径没问题 函数百分之百加载上来了
#16
那看来就是函数本身的问题了
#17
但我看句柄的值始终都是0啊,这也能表示加载成功了吗
#18
返回0,肯定是没加载成功了,GetLastError返回是什么
#19
LoadLibrary 返回本身就有点歧义 返回值这个问题上不用花费太长时间了
没报错就行
没报错就行
#20
Long,成功则返回库模块的句柄,零表示失败
函数说明是这样子的
函数说明是这样子的
#21
DLL加载和函数能不能成功使用是两个概念,要先加载DLL文件,才能谈下一步的函数调用
#22
LibHandle := LoadLibrary('c:\windows\system32\SpcClass.dll');
ShowMessage(SysErrorMessage(GetLastError));
这样用对吗
提示找不到指定模块
#23
提示的很明显,没找到SpcClass.dll
#24
DLL里调用了其他API 或者 DLL没
可能是你DLL里的代码引起的
可能是你DLL里的代码引起的
#25
在开始-》运行里输入c:\windows\system32\SpcClass.dll
看有什么反应。确认文件存在么?别告诉我文件名错了
如果文件不存在,那系统会弹出警告:Windows 找不到文件 'c:\windows\system32\SpcClass.dll'。请确定文件名是否正确后,再试一次。要搜索文件,请单击「开始」按钮,然后单击“搜索”
。
看有什么反应。确认文件存在么?别告诉我文件名错了
如果文件不存在,那系统会弹出警告:Windows 找不到文件 'c:\windows\system32\SpcClass.dll'。请确定文件名是否正确后,再试一次。要搜索文件,请单击「开始」按钮,然后单击“搜索”
。
#26
恩,你说的可能是对的,应该是DLL本身的问题
多谢大家的热心回复,我再去查下DLL吧
#27
你可以用工具看看这个函数有没有接口
#28
这个这个.....
#29
现在还是DLL无法加载上来,随机找了一个WINDOWS的DLL,加载没问题
以前也用CB写过一个DLL,用DELPHI调用,当时没问题,现在找来这个DLL,用同样方法调用,没问题
用BCB新建立一个DLL文件,不写任何代码,编译出来的DLL同样无法加载
现在判断,还是问题出在DLL文件本身
#30
关于LoadLibrary的注意事项,MSDN上说的很清楚,什么时候加载失败。
#31
还要多少人提示你看看GetLastError呢??
#32
看过了,无法找到指定模块