我需要以编程方式获取DLL的依赖项列表。以下是我尝试解决此任务的方式:BSTRGetDllDependencies(constwchar_t*dllPath){std::wstringdependencies;structLibDeleter{typedefHMODULEpointer;voidoperator()(HMODULEhMod){FreeLibrary(hMod);}};autohModRaw=LoadLibraryExW(dllPath,NULL,DONT_RESOLVE_DLL_REFERENCES);//(*)nullptrnereautohMod=std::uniq
我想在记事本中显示一个消息框,所以我找到了一个简单的dll注入(inject)示例。注入(inject)器本身不是我的并且似乎工作正常(获取进程的id,创建一个远程线程,获取dll文件的绝对路径)。我认为问题在于dll的实现。项目在没有任何警告的情况下编译,但没有达到预期的结果。你能看一下并帮助我理解问题吗?(我已经把发布版本的dll放到了injector项目文件夹中)dllmain.cpp://dllmain.cpp:DefinestheentrypointfortheDLLapplication.#include"stdafx.h"#include"dll.h"#include#i
我已经获得了使用c++dll的所有适当文件:头文件库文件动态链接库我正在尝试使用NodeN-API使用给定的文件,这样我们就可以在我们的Node服务器中使用这个c++dll。问题是,当我尝试使用node-gyp进行构建时,它会抛出以下错误:LINK:fatalerrorLNK1181:cannotopeninputfile'lib\MathUtils.lib'[C:\Development\Github\node-thin-client\service\build\interface.vcxproj]我使用的Node版本是:8.11.2node-gyp版本为:3.6.2我的bindin
所以,我有一个有趣的问题。我正在使用一组专有的dll,显然我没有这些dll的源代码。目标是编写一个中间dll,将来自专有dll的大量函数调用组合在一起。我遇到的问题是,在使用g++进行编译时,原始dll出现如下错误:无法导出libname_NULL_THUNK_DATA。找不到符号。如果我添加一个main并编译成一个可执行文件,一切都会按预期工作。我正在使用mingw进行编译。感谢您的帮助。针对第一个回复:要么我对您所说的内容感到困惑,要么我没有很好地表达我的问题。我并没有明确尝试从我的包装器中导出任何东西,我只是从它们的dll中调用函数。问题是我收到错误,无法将这些特定符号从dll导
我有一个第三方dll,我想更改符号名称。这可能吗?我不想让竞争对手知道我的产品使用什么组件。我没有dll的源代码。 最佳答案 在链接和运行时将可执行文件与dll绑定(bind)需要符号表。它通常包含装饰函数名称和序数。可以只使用序数。如果您正在构建库,您可以定义.def文件来控制符号表。但如果这是预建的第3方库,可能很难走。当然一切皆有可能,但我怀疑你的努力是否值得。如果您绝望了,我会尝试在十六进制编辑器中更retrofit饰函数名称中的一个字母,查找此函数的序数值,然后尝试使用带有此函数序数的GetProcAddress。
有什么方法可以使用“字符串”或其他一些命令来决定使用哪个版本的Boost来编译特定的可执行文件或.so?我所拥有的只是可执行文件/.so本身。 最佳答案 Boost主要是一个只有头文件的库,广泛使用模板(所有模板都可能编译成一些优化的二进制文件)。仅给定可执行二进制文件,您很可能无法推断出所使用的Boost版本。可能是您了解使用哪个Boost版本的唯一方法是查看可执行文件的版本号(如果有的话),然后在它来自的源代码控制存储库中查找(如果您有权访问它)。 关于c++-找出用于编译可执行文件
好了,问题来了。为了提高我对C++API的了解,我尝试学习更多关于库文件类型的知识。我对静态库很了解。您只需将库链接到项目中,其内容在编译和链接时放在二进制文件中。但是,当我开始尝试使用动态库时遇到了一个问题。我能够使用__declspec函数成功编译DLL文件,并创建外部block(因此它可以成功导出到C++)。但是,当我尝试链接文件时出现问题。根据我在网上看到的多个教程,我创建了一个带有前向定义的header,并将其包含到可执行项目中。然后,我确保将搜索目录添加到项目build设置中,以及我正在导入的库的路径。然后,当我去构建项目时,它会产生一个链接器错误(我知道是因为目标文件已编
我有一个C#app.exe和一个C#my.dll。my.dll.NET项目链接到nativeC++DLL(mynat.dll)(外部CDLL接口(interface)),并且从C#调用C++DLL没有问题。(通过使用[DllImport("mynat.dll",CharSet=CharSet.Unicode,CallingConvention=CallingConvention.Cdecl)]属性。)我现在需要添加的是让C#dll提供一些C++代码可以调用的回调函数。理想情况下,mynat.dllC++代码将使用LoadLibrary("my.dll")来加载C#dll,然后使用Get
我有一个托管的c++dll,其中包含几个托管类,这些托管类依次调用库中的nativec++代码,我已静态链接到该dll。但是,如果我尝试在dll上运行RegAsm.exe,该工具会正确报告“我们没有注册任何类型”,但随后挂起。我很确定这是loaderlock问题,当RegAsm尝试加载它时我的dll挂起。我使用的是VisualStudio2008速成版。让我感到困惑的是,将native代码放入dll时一切正常,但从库中静态链接时却不行。我知道这篇文章类似于thisquestion但我的dll中没有没有DllMain,因此我没有从DllMain运行MSIL代码的风险。此外,遵循对单个文件
我读到当进程终止时(以任何方式)操作系统释放了进程的所有内存,因此不需要依次调用每个dtor。现在我的问题是DLL或SO的内存与分配内存的清理有什么关系?我问是因为我最终可能会使用Java和/或C#调用带有一些静态C样式函数的C++DLL,这些函数将在堆上分配C++对象。抱歉,如果我对堆线程与堆栈线程的看法太过分了,我觉得我已经看不到__堆(即只有一个)的概念。使用库时还有其他潜在的内存泄漏陷阱吗? 最佳答案 库在加载时成为进程的一部分。对于内存、句柄、资源等的整理,系统不区分它们是在可执行镜像中创建的还是在库中创建的。