Articles of DLL

加载本机库时OSGI框架挂起

情况:开源的OSGI框架SMILA(http://www.eclipse.org/smila/)是通过Apache commons-daemon(http://commons.apache.org/daemon/)作为Windows Service启动的。 尝试从OSGI包通过System.loadLibrary()加载DLL,而Manifest.mf包含Bundle-NativeCode: path/to/dll 。 环境:Windows Server 2003,Java 1.6 错误:在调用System.loadLibrary() ,完整的Java进程挂起。 当服务停止时, System.loadLibrary()完成并执行代码,直到OSGI框架closures。 在Windows Server 2008上不会发生此错误,或者OSGI框架未作为服务启动。 DLL本身被剥离到没有functiontesting。 所有导入都是静态的,唯一依赖的库是kernel32.ddl 。 谁能想象为什么会发生这种情况,以及如何解决这个问题? 包含DLL的清单: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: NTFS Utils Acl Win32 Library Bundle-SymbolicName: com.eccenca.utils.ntfs.acl.win32 Bundle-Version: 2.2.0 Bundle-Vendor: brox IT-Solutions GmbH Fragment-Host: com.eccenca.utils.ntfs Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86)) Bundle-NativeCode: ntfsacl/Release/NtfsAcl.dll Bundle-RequiredExecutionEnvironment: JavaSE-1.6+ 包含代码的清单: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 […]

从dll函数调用正确获取Windows版本?

假设我正在写一个多用途的dll,其中包含一个获取操作系统版本的函数: void get_os_version(DWORD *major, DWORD *minor) { OSVERSIONINFOEX osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOsVersionInfoSize = sizeof(OSVERSIONINFOEX); // deprecated but easier to use for this example's sake GetVersionEx((OSVERSIONINFO*)&osvi); *major = osvi.dwMajorVersion; *minor = osvi.dwMinorVersion; } 对于Windows版本高于Windows 8的版本,需要embedded一个指定受支持平台的清单(请参阅此处的详细信息)。 所以我在编译时使用/MANIFEST:NO标志禁用自动生成我的dll文件/MANIFEST:NO ,而是添加下面的清单: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> </requestedPrivileges> </security> </trustInfo> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> […]

可以64位EXE链接对32位DLL?

我问,因为我注意到,许多64位的EXE链接到似乎是32位的DLL。 例如,我的64位MFC应用程序链接对user32.dll, urlmon.dll, wininet.dll – 所有这些都是32位DLL驻留在Windows \ system32中。 那么,这是适用于这些DLL的MS特定的魔术,还是有向后兼容,对于需要使用传统32位DLL的64位EXE?

命令行工具来查找Dll的依赖关系

哪些命令行工具存在以recursion方式查找所有DLL依赖关系? 我试过用Visual Studio来的dumpbin和Dependency Walker (又名Depends.exe),但是dumpbin只能find第一级的依赖关系,而Dependency Walker的输出并不是真正的计算机友好。

如何正确地终止一个dll内的挂起的线程?

大家好, 我有一个包含错误的第三方库。 当我调用一个函数时,它可能会挂起。 库函数在dll中调用。 我决定把呼叫转移到线程中,等待一段时间。 如果线程完成,然后确定。 如果不是 – 我应该终止它的强制性。 这里简单的例子: unsigned Counter = 0; void f() { HANDLE hThread; unsigned threadID; // Create the second thread. hThread = (HANDLE)_beginthreadex( NULL, 0, DoSomething, NULL, 0, &threadID ); if (WAIT_TIMEOUT == WaitForSingleObject( hThread, 5000 )) { TerminateThread(hThread, 1); wcout << L"Process is Timed Out"; } else { […]

SidBySide:第三方DLL指两个版本的MSVCR80.DLL

我们包括一个第三方lib + DLL,最近在安装上造成了很多麻烦。 使用dependencywalker ,我们发现dll本身引用了两个不同的版本 MSVCR80.DLL: Version 8.0.50727.4053 and Version 8.0.50727.42 替代文字http://img101.imageshack.us/img101/1734/dependencywalk2.jpg 在大多数情况下,即使我们不分发两个版本,安装也不会造成任何问题。 但在很多情况下,我们的安装不能启动。 然后,我们从SideBySidepipe理器的窗口系统事件日志中find消息:“DLL的版本不匹配”。 在大多数情况下,这个问题可以通过安装.NET框架来解决(虽然我们不使用这个)。 但是现在我们遇到了这种情况,这没有帮助。 我知道一个解决scheme是将两个版本安装为一个共享程序集,但这似乎并不容易,而且我更喜欢更简单的解决scheme。 有人知道一个解决方法吗? 我可以以某种方式使用只有一个版本的Dll? 编辑:我现在尝试cristians意见: D:\Develop\LEADTOOLS15\patch_maifest>mt.exe -inputresource:ltkrn15u.dll;#1 -out:old.manifest Microsoft (R) Manifest Tool version 5.2.3790.2075 Copyright (c) Microsoft Corporation 2005. All rights reserved. mt.exe : general error c101008c: Failed to read the manifest from the resource of file "ltkrn15u.dll". Ressource […]

如何获取DLL的文件名?

我有一个C ++ Windows应用程序myapp.exe加载了几个插件。 插件需要find其DLL的path。 我可以使用GetModuleFileName,但是它需要插件DLL的句柄。 我不知道从哪里得到这个句柄。 GetModuleHandle(NULL)将句柄返回给可执行文件。 一个select是使用GetModuleHandle(GetModuleHandle(“myplugin.dll”)),但是这需要插件的名称是硬编码,我想避免。 任何帮助表示赞赏。 保罗

问题 – TCHAR作为LPARAM属于另一个进程/线程的窗口

所以我通过C书的例子来玩/执行与Windows窗口,有一些关于DLL注入部分,让我难以置信,我无法解决它。 我创build了一个属于另一个线程/进程的对话框,我试图发送它的TCHARvariables,以便它可以在某些函数中使用该var(函数和tchar都在同一个dll文件中) 所以当创build对话框并且坐在另一个线程中时,我会发送一条消息。 首先我声明tchar TCHAR finalpath[MAX_PATH]; 然后,我只是填充信息(我在dll线程中,而不是在对话框的线程中,让我也提到,我必须在dll线程中做到这一点,因为这只是填补所需的tchar(我需要得到dll的工作目录,并填写在tchar)) 所以,当我得到这个信息在我的tchar我想发送一个消息到对话框,并使用tchar作为LPARAM(wparam是hwnd顺便说一句) SendMessage(hWndDIPS, WM_APP, (WPARAM) lista, (LPARAM)finalpath); 之后,我在另一个线程对话框过程循环中做基本的功课… INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { chHANDLE_DLGMSG(hWnd, WM_CLOSE, Dlg_OnClose); case WM_APP: SaveListViewItemPositions((HWND) wParam, (TCHAR)lParam); break; } return(FALSE); } 应该接受参数的函数(这个函数驻留在共享dll中,并且如上所述被程序调用,定义如下.. void SaveListViewItemPositions(HWND hWndLV,TCHAR sejv []){…} 我得到的编译器错误是 Error 7 error C2664: 'SaveListViewItemPositions' : cannot convert […]

依赖Walker:缺lessdll

我一直在尝试用Dependency Walker来parsing可执行文件的.dll依赖项。 目前,我正在以下面的forms丢失.dll: API-MS-WIN -XXX EXT-MS-WIN -XXX 例如: API-MS-WIN-APPMODEL-IDENTITY-L1-2-0.DLL API-MS-WIN-APPMODEL-RUNTIME-INTERNAL-L1-1-0.DLL API-MS-WIN-BASE-UTIL-L1-1-0.DLL API-MS-WIN-CORE-APIQUERY-L1-1-0.DLL EXT-MS-WIN-RTCORE-NTUSER-SYSCOLORS-L1-1-0.DLL 有没有人有任何想法如何解决这些问题? 任何帮助将不胜感激! 其他信息:我使用Visual Studio 2013编译可执行文件。 最有趣的是编译过程中没有收到任何错误。 但是,由于缺less依赖关系,我无法运行它。 我还附上了依赖沃克的截图: 更新1:作为一个尝试解决这个问题,我试图将编译期间VS使用的库的path添加到$ PATH环境variables中,而没有任何运气( 依赖Walker仍然显示未解决的依赖关系)。

如何使用导出C ++类的DLL使用延迟加载

我有一个DLL one.dll使用类two.dll通过class __declspec(dllexport)从two.dll导出。 我想one.dll使用/delayload for two.dll ,但我得到一个链接错误: LINK : fatal error LNK1194: cannot delay-load 'two.dll' due to import of data symbol '"__declspec(dllimport) const TwoClass::`vftable'" (__imp_??_7TwoClass@@6B@)'; link without /DELAYLOAD:two.dll 这是在发布版本; 在一个debugging版本的工作。 (我不知道在vtable导出方面版本和debugging之间有什么区别,我也不能find任何编译器开关或编译指令来控制它。) 我如何使用/delayload在一个发布版本中导出这样的类的DLL?