Articles of DLL

DllMain在exe文件?

是否有可能接收DllMain像关于线程附加/分离在独立的EXE通知没有使用任何额外的DLL? 编辑:这只是一个理论问题,与我正在做的一些testing有关。 不是现实生活中的情况。

std :: unique_lock <std :: mutex>禁止卸载

卸载dll时出现问题。 就像这个一样,退出不同。 我正在使用LoadLibraryA加载一个dll,然后调用一个函数,并closures与FreeLibrary的DLL。 但是,DLL不卸载,但FreeLibrary返回成功。 简化代码: void foo() { std::unique_lock<std::mutex> lock(mtx_); } 在debugging代码并查看Process Explorer时, unique_lock创build第二个线程, 但为什么 ? 此线程只要应用程序运行就运行。 没有什么别的; 没有其他句柄的DLL,没有其他function。 此外,该DLL仍然在程序中加载。 如果我删除上面的行,一切都很好。 DLL是卸载好,没有额外的线程。 所以我的问题是, 如何避免这种行为,为什么是unique_lock创build一个线程? 互斥体是用于multithreading,但在testing时,只有一个线程,加载DLL调用foo,并卸载DLL。 编辑: 我不知道这是否是在互斥体/ unique_lock的视觉工作室实施中的错误,但我通过使用boost的互斥体/ unique_lock解决了这个问题。

DLL封装和DLL的区别

我不知道什么是DLL包装。 有人能解释我吗? 1)什么是DLL包装? 2)它与DLL有什么不同? 3)如何使用它? 感谢致敬,

如何build立JNI .dll?

我在Eclipse中有一个包含一些JNI代码的Java项目。 JNI代码是跨平台的 – 适用于Windows和Linux。 我怎样才能build立一个DLL? 谢谢。

共享进程和DLL之间的全局/静态variables

我想共享一个静态/全局variables只有进程和进程调用的DLL之间。 该exe和dll在相同的内存地址空间。 我不希望variables在其他进程之间共享。 详细阐述问题: 假定a.cpp中有一个静态/全局variablesx 。 exe foo.exe和dll bar.dll都有a.cpp ,所以variablesx在两个图像中。 现在, foo.exedynamic加载(或静态) bar.dll 。 然后,问题是variablesx是否被exe和dll共享,或者不是。 在Windows中,这两个人永远不会共享x :这个exe和dll将会有一个单独的x副本。 但是,在Linux中,exe和dll共享variablesx 。 不幸的是,我想要Linux的行为。 我首先考虑在Windows上使用pragma data_seg 。 但是,即使我正确设置共享数据段, foo.exe和bar.dll从不共享x 。 回想一下, bar.dll被加载到bar.dll的地址空间中。 但是,如果我运行foo.exe另一个实例,则共享x 。 但是,我不希望x被不同的进程共享。 所以,使用data_seg失败了。 我可能会使用一个内存映射文件,通过在exe和dll之间创build一个唯一的名称,我现在正在尝试。 两个问题: 为什么Linux和Windows的行为有所不同? 任何人都可以解释更多的这个? 在Windows上解决这个问题最简单的方法是什么?

如何dllexport派生自std :: runtime_error的类?

我build立了一个库,提供了一个从标准exception派生的exception类: #include <stdexcept> #include <string> class BaseException : public std::runtime_error { public: BaseException( std::string const & msg ); }; 到现在为止还挺好。 在Unix上编译和处理得很好。 现在我准备将其编译到Windows DLL中: #ifdef WIN32 #define MY_EXPORT __declspec(dllexport) #else #define MY_EXPORT #endif #include <stdexcept> #include <string> class MY_EXPORT BaseException : public std::runtime_error { public: BaseException( std::string const & msg ); }; 但是,这给了我警告C4275 : non – […]

Windows / C ++:如何使用未注册的COM DLL

在我们的应用程序中,我们需要使用一个没有在系统中注册过的COM DLL(即msdia100.dll)。 Earler,我们通过这个代码调用它的DllRegisterServer来调用DLL: // Register DIA DLL required by Breakpad std::string diaLibPath = "msdia100"; HMODULE diaLib = LoadLibrary(diaLibPath.c_str()); if( diaLib == NULL ) { errors << "Cannot load DLL " << diaLibPath << endl; return; } typedef HRESULT ( __stdcall * regServer_t )(void); regServer_t regServer = (regServer_t)GetProcAddress(diaLib, "DllRegisterServer"); if( regServer == NULL ) { errors […]

在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行话? 感谢所有回答的人,这真的很有帮助,

从CGo中调用Go的COM对象方法

我在Go中创build了一个Direct3D9包装器 ,它使用CGo来与C中的COM对象进行交互。 我想摆脱在Windows下的C编译器的依赖,所以用户不必安装MinGW或Cygwin从Go使用DirectX。 问题是,d3d9.dll不公开C函数,但使用COM。 加载DLL(使用syscall.LoadLibrary("d3d9.dll") )后可以直接调用的唯一函数是Direct3DCreate9 。 这将返回一个COM对象,将所有function公开为方法。 如何在没有CGo的情况下从纯Go中调用COM对象方法? 我知道Go-OLE库声明它调用没有CGo的COM接口,但我不能从源代码中看到如何去为Direct3D9做同样的事情。 一个简单的例子只有相关的部分将是非常有帮助的。

Msvcr71.dll Msvcp71.dll丢失

我写了一些应用程序。 但是,当我在几个操作系统上运行它,我们正在得到这两个文件丢失。 当我将它们添加到Windows \ system32文件夹应用程序工作正常。 我看到这个解决scheme如何安装msvcr71-DLL正确,但有什么办法可以做 我的应用程序使用更新版本的最新.net附带的文件 分配。 感谢帮助。