如果您在LoadLibrary
没有路径的情况下呼叫(例如,LoadLibrary("whatever.dll")
Windows通常会遵循其标准搜索算法,那么它将用于查找EXE.
我的问题是:假设应用程序清单指定指定系统DLL的特定版本,例如comctl32.dll 6.0.在这种情况下,将LoadLibrary("comctl32.dll")
立即转到正确的并排文件夹,还是仍然执行某种搜索?
我正在使用它的名字加载一个dll,如下所示:
HANDLE hlib = LoadLibrary("Winfax.dll");
现在我想知道dll加载到哪条路径.有没有办法获取DLL句柄的完整路径和文件名?
是否可以将外部CLI/C++ DLL作为嵌入式资源或类似内容嵌入到MFC EXE中?我的应用程序当前连接到它旁边的DLL,它具有一些基本功能,如连接数据库,从数据库中提取信息等.
我使用LoadLibrary来使用DLL函数.然后我用selfida保护我的EXE并将EXE和DLL打包在一起.问题是虽然打包DLL和EXE我必须在itida中禁用文件修补,这是一个非常强大的功能.我必须禁用它,因为当我打包我的EXE它需要稍微修改文件,然后itida认为它已被破解或某些东西,并且不允许应用程序工作.
那么有没有办法将这个DLL嵌入我的EXE?DLL遗憾地与它们不兼容,这就是为什么它是一个单独的文件.
如果我加载DLL LoadLibrary
,该DLL是否保证保持加载?如果没有,我该如何防止重新加载.
实际情况:我有一个调度程序,根据一些消息,需要加载几个dll中的一个并从中执行一些功能.我无法在编译时链接它们,所以我使用LoadLibrary
.因为可能会有很多电话,所以我不想LoadLibrary
每次都打电话,因为事实证明它是一个瓶颈.所以我想每个DLL只调用一次,每个dll只调用一次GetProcAddress
函数,然后将它缓存到某个地方.但它安全吗?我保证在任何后续通话中调用该功能都可以吗?如果没有,我怎么能有这个保证?
我有一些试图加载Dll的代码.
我遇到了一个奇怪的'错误'.当尝试从绝对路径加载dll时,我得到一个非空HMODULE,它在GetLastError调用时没有提供Windows错误代码(即GetLastError根据msdn返回'0'或成功).在调用此dll中的函数时,我得到的值不正确.
这种行为很奇怪,因为相反,我使用SetCurrentDirectory将当前目录切换为当前dll的目录,并使用对LoadLibrary的相对路径调用,我得到正确的值.
这是一个描述情况的片段:
使用绝对路径:
std::string libLoc = get_dll_location(); // Get the directory of this dll
HMODULE myDLL = LoadLibraryA(libLoc.c_str()); // Non-null value
DWORD lastError = GetLastError(); // returns 0
MyObj * value = UseDLL(myDLL); // bad value
Run Code Online (Sandbox Code Playgroud)
使用相对路径:
SetCurrentDirectory("c:\\path\\containing\\dll\\"); // hard coded path to dll's folder
HMODULE myDLL = LoadLibrary("myDll.dll"); // Non-null value
MyObj * value = UseDLL(myDLL); // Good value
Run Code Online (Sandbox Code Playgroud)
我真的想避免使用SetCurrentDirectory,因为使用这个Dll的应用程序可能是多线程的,并且要求目录保持不变.
任何关于这个问题的见解将不胜感激.希望这只是我的一个小错误.
更新:使用LoadLibraryEx似乎是不可能的,因为LOAD_LIBRARY_SEARCH_*标志似乎不可用(我已经尝试安装KB2533623更新).
我有这个Loadlibraty()错误3765269347困扰我.我正在实现一个构建为x64的C++控制台应用程序来加载x64本机C++ DLL.以下是加载DLL的C++控制台应用程序中的代码:
bool InitDll()
{
HINSTANCE hInst = LoadLibrary(_T("C:\\TIS_Nick\\Hardware\\Devices\\ThorDetectorSwitch\\TDSTest\\TDSTest\\Debug\\Modules_Native\\ThorDetectorSwitch.dll"));
if( hInst != NULL )
{
FreeLibrary( hInst );
return true;
}
else
{
DWORD err = GetLastError();
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是3765269347,我认为这意味着C++无法处理此错误.我确定我加载dll的路径是正确的.
我还使用Monitor Process来跟踪调用dll和函数的内容.这是我认为相关的信息.
11:08:07.3196483 AM TDSTest.exe 1604 QueryNameInformationFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\x64\Debug\TDSTest.exe SUCCESS Name: \TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\x64\Debug\TDSTest.exe
11:08:08.5720585 AM TDSTest.exe 1604 CreateFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
11:08:08.5721041 AM TDSTest.exe 1604 QueryBasicInformationFile C:\TIS_Nick\Hardware\Devices\ThorDetectorSwitch\TDSTest\TDSTest\Debug\Modules_Native\ThorDetectorSwitch.dll SUCCESS CreationTime: …
Run Code Online (Sandbox Code Playgroud) 我有三个程序 -
程序1:另外使用MAPI的Microsoft Outlook加载项.
程序2:不使用MAPI 的独立exe
程序3:确实使用MAPI 的独立exe .
这三个程序都是用C#编写的,并且在某些时候使用WinForms RichTextBox.
在使用Office 365程序"1"和"3"的x64 Windows 8安装上没有问题,但只要使用以下堆栈构造RichTextBox控件,程序"2"就会崩溃:
System.IO.FileNotFoundException : C:\Program Files (x86)\Common Files\Microsoft Shared\Office15\riched20.dll
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
at System.Windows.Forms.RichTextBox.get_CreateParams()
at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
at System.Windows.Forms.TextBoxBase..ctor()
at System.Windows.Forms.RichTextBox..ctor()
<snip>
Run Code Online (Sandbox Code Playgroud)
反汇编RichTextBox.get_CreateParams()显示它在'riched20.dll'上调用LoadLibrary,然后在加载的模块上调用GetModuleFileName.
对于程序2,Visual Studio告诉我它已从路径"C:\ Program Files\Microsoft Office 15\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE15\RICHED20.DLL"加载了riched20.dll.
然后调用FileVersionInfo.GetVersionInfo()失败,因为它给出的路径不存在.
但是 - 程序1(outlook-addin)也从同一路径加载了riched20.dll - 但不知何故成功了!
程序2没有加载MAPI工作正常,它从C:\ Windows\syswow62加载riched20.dll
程序3在创建富文本框之前初始化MAPI,我知道某些MAPI函数会将当前工作目录更改为MAPI目录.这可能解释了为什么程序3加载office的riched20.dll并且程序2加载system32副本.
我怀疑程序1工作和程序3失败的区别在于路径中的vfs代表"虚拟文件系统",因此作为Outlook插件运行的程序1可以某种方式使用不具有的路径找到riched20.dll确实存在.
这三个程序都适用于以前版本的办公室.
作为一种解决方法,在初始化MAPI之前自己调用'LoadLibrary("riched20.dll")会使问题消失 - 但感觉就像一个可怕的黑客.
我也找不到有关此'vfs'文件路径的任何信息以及它在Internet上的含义.
对于我自己的教育,是否有人能够更好地解释这里发生了什么?
更新:我已经解决了与"点击运行"功能有关的问题.
我正在尝试使用以下代码加载在C:\ Windows\System32 \文件夹中安装了打印机驱动程序的DLL:
LoadLibraryW(L"C:\\Windows\\System32\\MagAPI.dll");
Run Code Online (Sandbox Code Playgroud)
GetLastError()
报告"无法找到指定的模块".如果我将DLL移动到System32文件夹之外(例如C:\ SomeFolder\MagAPI.dll),那么它将加载正常,因此它似乎不是DLL本身的问题.是否有一些奇怪的Windows安全功能可能阻止我的应用程序加载它?这是我唯一能想到的,但我找不到任何明确的答案.
这是ShowSnaps的调试输出,它显示了它失败的地方:
1a8c:1fd4 @ 19006756 - LdrLoadDll - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpLoadDll - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpLoadDll - INFO: Loading DLL C:\Windows\system32\MagAPI.dll from path C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpFindOrMapDll - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpSearchPath - ENTER: DLL name: C:\Windows\system32\MagAPI.dll DLL path: C:\Windows\system32;C:\Windows\system;C:\Windows;.;<otherstuff>
1a8c:1fd4 @ 19006756 - LdrpResolveFileName - ENTER: …
Run Code Online (Sandbox Code Playgroud) 我试图用C++构建一个DLL,并通过使用loadlibrary
和calllib
指令从MATLAB中调用它.它适用于一个值并且它正常返回一个值,但现在我试图将一个完整的数组从C++ DLL返回到MATLAB作为函数的输出.
如你所知C++通常将数组作为指针返回但是这不适用于MATLAB ...我在互联网上搜索它并且他们正在使用一些MEX功能但是不清楚......
你能解释一下如何将数组从C++ DLL calllib
返回到MATLAB ,我们应该如何从C++代码中返回它?
我刚刚意外地发现这样做GetModuleHandle("ntdll.dll")
没有事先调用LoadLibrary("ntdll.dll")
.
这意味着ntdll.dll
已在我的进程中加载.
是否可以安全地假设ntdll.dll
将始终加载到Win32应用程序上,以便LoadLibrary
不需要调用?
loadlibrary ×10
dll ×7
c++ ×6
winapi ×3
windows ×2
.net ×1
arrays ×1
external ×1
manifest ×1
mapi ×1
matlab ×1
mfc ×1
ntdll ×1
pinvoke ×1
richtextbox ×1
side-by-side ×1
system32 ×1
visual-c++ ×1