问题:
写项目时要调用a.dll,a.dll依赖a1.dll,路径确保无误,dll也在对应的目录,依赖dll也在,使用LoadLibrary()加载时会失败,用GetLastError()返回126。网上搜了下126是没有找到指定模块;
解决方案:
2种解决方案:
1. 调用的dll放在指定目录,依赖的dll放在程序目录下
当前运行的程序是test.exe,在D:\\TEST\\文件夹下,
a.dll在D:\\TEST\\DLL\\文件夹下,
那么要把a1.dll放在D:\\TEST文件夹下
2. 使用LoadLibraryEx()函数
LoadLibraryEx(sdkFullPath,NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
LoadLibraryEx参数说明
lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的
lpCommandLine参数指定的同样的搜索顺序
hFile Long,未用,设为零
dwFlags Long,指定下述常数的一个或多个
DONT_RESOLVE_DLL_REFERENCES:不对DLL进行初始化,仅用于NT
LOAD_LIBRARY_AS_DATAFILE:不准备DLL执行。如装载一个DLL只是为了访问它的资源,就可以改善一部分性能
LOAD_WITH_ALTERED_SEARCH_PATH:指定搜索的路径
参考:https://www.cnblogs.com/huangsitao1024/p/10174034.html
公司项目采用Electron(electronjs.org/ )开发pc应用,会涉及到与底层硬件设备的通信,而sdk封装 基本上都是通过 C++ 动态链接库dll实现的。
有两种方案可供选择:
方案一: 使用node-ffi
方案二: 使用C++编写一个node addon,通过LoadLibrary调用dll
以上两种方案都可以解决dll调用问题,方案选型要个人对C++ 的掌握程度,如果熟悉C++开发,可以直接选择方案二最方便。如果完全不了解C++,那么只能采用方案一。
由于笔主不太懂C++,最终选择第一种方案。
二、什么是node-ffi?
( www.npmjs.com/pack
使用::LoadLibrary(sdkFullPath)动态加载海康dll,加载失败,GetLastError返回错误码126。
错误码126表示没有找到指定模块,但是::LoadLibrary的参数sdk路径是正确的。
最后使用::LoadLibraryEx(sdkFullPath,NULL, LOAD_WITH_ALTERED_SEARCH_PATH),...
Qt开发的
dll,在VS项目里加载报”找不到指定模块“,GetLast
Error =
126
即使
LoadLibrary用绝对路径也不对
这是因为Qt开发的
dll往往还依赖Qt本身的
dll文件,当
LoadLibrary找不到这些文件时也会报
126
因此用指令windeployqt xxx.
dll看看
dll都依赖了哪些库,然后一起放在exe路径下就可以了。
因此
LoadLibrary不仅需要找引用的
dll本身,还需要找
dll依赖的
dll,否则就会报
126.
可以使用Matlab中的loadlibrary函数来调用DLL文件。首先,需要确认DLL文件是否在Matlab的搜索路径中,如果不在,可以通过addpath函数添加到搜索路径中。然后,可以使用loadlibrary函数加载DLL文件,语法如下:
loadlibrary('DLL文件路径','头文件路径')
其中,DLL文件路径是DLL文件的完整路径,头文件路径是包含DLL文件导出函数声明的头文件路径。
加载成功后,可以使用calllib函数来调用DLL文件中的导出函数,语法如下:
output = calllib('DLL名称','导出函数名称',input)
其中,DLL名称是通过loadlibrary函数加载的DLL文件的名称,导出函数名称是DLL文件中要调用的函数名称,input是传递给导出函数的输入参数,output是导出函数的输出参数。
注意,在使用loadlibrary和calllib函数时,需要根据DLL文件的导出函数类型和参数类型进行正确的匹配。