Articles of DLL

在windows上构build和部署dll:SxS,清单和所有爵士乐

从VS 2005开始,我发现不可能简单地针对MS运行时构build一个DLL并将其部署在一起( http://www.ddj.com/windows/184406482 )。 我对表单SxS和Co深感困惑:MSDN文档非常差,带有循环引用; 特别是因为我更像一个Unix的家伙,我发现所有这些都是不知情的。 我的核心问题是链接到msvc9或msvc8 DLL:因为这些运行时不可重新分发,有什么步骤来链接和部署这样一个DLL? 特别是,如何生成清单(我不想mt.exe,我想要在编译器中移植的东西),它们是如何embedded,使用的? 并排组装是什么意思? 基本上,我在哪里可以find任何types的规范,而不是MS行话? 感谢所有回答的人,这真的很有帮助,

加载本机库时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"> […]

VB – 隐式链接一个DLL

我正在一个VB6graphics界面,我需要隐式链接到一个DLL。 这个动机来自我以前的问题 。 有问题的DLL使用静态TLS, __declspec(thread) ,当然这当使用LoadLibray明确地链接DLL时会失败。 我真的想避免修改DLL,所以没有人知道如何欺骗VB6可执行文件隐式链接到特定的DLL?

DLL的开销

我有一个很基本的问题。 当一个库只用于一个进程时。 我应该把它作为一个静态库吗? 如果我使用库作为DLL,但只有一个进程使用它。 **什么是开销?*

dynamic库调用函数

如果可能的话,在编译期间我们不知道函数的名字的时候,加载一个dynamic库并调用它的一个函数是最好的方法? 例如,有没有办法让程序从文件中读取一个string,然后加载一个DLL并search并调用一个函数,其名称是从文件中读取的string? 帮助将非常感激。

为PHP 5.4构build/获取php_memcache.dll最简单的方法

我打算在我们的应用程序中使用Traits,在PHP 5.4中可用,需要Memcache,因此需要php_memcache.dll 我正在使用PHP 5.4最新候选版本的Windows机器上开发。 我无法find一个PHP 5.4版本的php_memcache.dll,所以想要知道如何获得它或失败,自己构build它( http://www.php.net/manual/en/install上的说明。 windows.building.php似乎有点缺乏!)。 我没有在我的机器上安装Visual Studio或任何构build工具(并且最好不想付钱)。 谢谢

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 […]