标签: loadlibrary

使用清单在LoadLibrary中搜索Windows路径

如果您在LoadLibrary没有路径的情况下呼叫(例如,LoadLibrary("whatever.dll")Windows通常会遵循其标准搜索算法,那么它将用于查找EXE.

我的问题是:假设应用程序清单指定指定系统DLL的特定版本,例如comctl32.dll 6.0.在这种情况下,将LoadLibrary("comctl32.dll")立即转到正确的并排文件夹,还是仍然执行某种搜索?

windows dll manifest side-by-side loadlibrary

3
推荐指数
1
解决办法
5613
查看次数

使用LoadLibrary("MyDll.dll")获取加载DLL的路径

我正在使用它的名字加载一个dll,如下所示:

HANDLE hlib = LoadLibrary("Winfax.dll");

现在我想知道dll加载到哪条路径.有没有办法获取DLL句柄的完整路径和文件名?

winapi loadlibrary

3
推荐指数
1
解决办法
2210
查看次数

在MFC C++ EXE中嵌入DLL?

是否可以将外部CLI/C++ DLL作为嵌入式资源或类似内容嵌入到MFC EXE中?我的应用程序当前连接到它旁边的DLL,它具有一些基本功能,如连接数据库,从数据库中提取信息等.

我使用LoadLibrary来使用DLL函数.然后我用selfida保护我的EXE并将EXE和DLL打包在一起.问题是虽然打包DLL和EXE我必须在itida中禁用文件修补,这是一个非常强大的功能.我必须禁用它,因为当我打包我的EXE它需要稍微修改文件,然后itida认为它已被破解或某些东西,并且不允许应用程序工作.

那么有没有办法将这个DLL嵌入我的EXE?DLL遗憾地与它们不兼容,这就是为什么它是一个单独的文件.

c++ mfc external loadlibrary command-line-interface

3
推荐指数
1
解决办法
6959
查看次数

使用LoadLibrary加载DLL

如果我加载DLL LoadLibrary,该DLL是否保证保持加载?如果没有,我该如何防止重新加载.

实际情况:我有一个调度程序,根据一些消息,需要加载几个dll中的一个并从中执行一些功能.我无法在编译时链接它们,所以我使用LoadLibrary.因为可能会有很多电话,所以我不想LoadLibrary每次都打电话,因为事实证明它是一个瓶颈.所以我想每个DLL只调用一次,每个dll只调用一次GetProcAddress函数,然后将它缓存到某个地方.但它安全吗?我保证在任何后续通话中调用该功能都可以吗?如果没有,我怎么能有这个保证?

c++ dll loadlibrary dynamic-loading visual-c++

3
推荐指数
1
解决办法
1750
查看次数

带有绝对路径的LoadLibrary返回不正确的HMODULE且没有错误

我有一些试图加载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更新).

c++ dll winapi loadlibrary absolute-path

3
推荐指数
2
解决办法
9598
查看次数

C++ Loadlibrary()错误3765269347

我有这个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)

c++ dll loadlibrary

3
推荐指数
1
解决办法
5120
查看次数

为什么安装Office 2013在使用MAPI后会破坏WinForms RichTextBox?

我有三个程序 -

程序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上的含义.

对于我自己的教育,是否有人能够更好地解释这里发生了什么?

更新:我已经解决了与"点击运行"功能有关的问题.

.net mapi pinvoke richtextbox loadlibrary

3
推荐指数
1
解决办法
1426
查看次数

LoadLibraryW()无法在System32中加载DLL

我正在尝试使用以下代码加载在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 system32

3
推荐指数
1
解决办法
8915
查看次数

将数组从c ++ dll返回到matlab

我试图用C++构建一个DLL,并通过使用loadlibrarycalllib指令从MATLAB中调用它.它适用于一个值并且它正常返回一个值,但现在我试图将一个完整的数组从C++ DLL返回到MATLAB作为函数的输出.

如你所知C++通常将数组作为指针返回但是这不适用于MATLAB ...我在互联网上搜索它并且他们正在使用一些MEX功能但是不清楚......

你能解释一下如何将数组从C++ DLL calllib返回到MATLAB ,我们应该如何从C++代码中返回它?

c++ arrays dll matlab loadlibrary

3
推荐指数
1
解决办法
3853
查看次数

Win32应用程序是否自动链接到ntdll.dll?

我刚刚意外地发现这样做GetModuleHandle("ntdll.dll")没有事先调用LoadLibrary("ntdll.dll").

这意味着ntdll.dll已在我的进程中加载​​.

是否可以安全地假设ntdll.dll将始终加载到Win32应用程序上,以便LoadLibrary不需要调用?

windows dll winapi loadlibrary ntdll

3
推荐指数
1
解决办法
778
查看次数