用PE导出表解决功能地址问题
任何人都可以向我解释如何从PE映像中正确获取功能地址,然后用委托来调用该功能? 我发现一个很好的零件代码在谷歌搜索中,该代码从DLL库中加载导出,但是它只会从中获取函数名称...因此我对其进行了修改,如下所示: [DllImport("ImageHlp", CallingConvention = CallingConvention.Winapi), SuppressUnmanagedCodeSecurity] public static extern bool MapAndLoad(string imageName, string dllPath, out LOADED_IMAGE loadedImage, bool dotDll, bool readOnly); public static IntPtr CustomGetProcAddress(string modulePath, string moduleProc) { LOADED_IMAGE loadedImag
2 2024-01-07
编程技术问答社区
罗伯特-吉塞克的未管理的出口产品
我正在尝试从vb.net到不受管理的C ++工作. 我正在使用 Robert Giesecke的未经管理的出口并试图遵循此非常有用的提示.我通过在我的 *.cpp和 *.h文件居住的目录中通过邮寄操作从.NET项目中复制DLL. . 我用dumpbin /EXPORTS Nugget.Discovery.dll检查了我的dll,它告诉我有出口: File Type: DLL Section contains the following exports for \Nugget.Discovery.dll 00000000 characteristics 52554A05 time date stamp Wed Oct 09 14:20:21 2013 0.00 version 0 ordinal base 2 number of functions 2 number of names ordinal hint RVA
2 2024-01-06
编程技术问答社区
从C#调用非托管的C++
我正在使用.NET 4.0在Win7上运行VS2012. 我尝试了以下内容: 创建C ++ DLL项目 检查\取消选中的导出符号框 我确保我的平台目标相同.就我而言,win32 我已经在需要时添加了必要的外部" C"和__declspec(dllexport). 我已经成功编译了我的DLL,并试图在C#项目中引用它. 不幸的是,我遇到了一个错误,告诉我无法添加它,并且我需要确保它是有效的组件或com对象. 我已经放弃了试图使我的代码导出,所以我对" 42"的示例感到满意! 我尝试使用Dumpbin查看它,并且它正确地导出了符号: 1 0 00011023 ??0CEvolutionSimulator@@QAE@XZ 2 1 00011127 ??4CEvolutionSimulator@@QAEAAV0@ABV0@@Z 3 2 00011005 ?GetNumber@CEvolutionSimulator@@QAEHXZ 4
4 2024-01-06
编程技术问答社区
Oxygene中的DLL实例
有人可以告诉我在哪里可以找到一个为.net的氧气制作dll(WindowsControllibrary)的示例吗? 在旧的Delphi中,您进行了一个导出部分. 解决方案 使用Delphi Prism创建非托管的DLL导出,并与Delphi 2010一起称呼您必须执行以下操作: 在Delphi Prism中: 文件|新|项目 在左侧的树视图中,选择Delphi Prism 选择Windows类库 按OK. 这将创建Windows类库的模板 右键单击项目" ClassLibraryx",然后选择属性: 在兼容性下选择"允许不安全的代码" 在构建中,找到一般部分,然后将CPU类型更改为" x86" 右键单击创建的" classLibraryx"选项卡,然后选择"保存选定的项目" 这设置了该项目,以支持 unmanagedexportatattribute . 然后在代码中您需要创建类方法.在下面的示例中,我添加了system.
0 2024-01-04
编程技术问答社区
__declspec(dllexport) 静态链接库到dll
我为大学提供了一个简单的项目设置. 一个API项目,我要使用的每个库(GLEW,GLFW,GLM)都静态链接.这些库应与我自己的API代码合并为一个DLL文件. 另一个项目只能具有一个依赖关系,即DLL.投掷DLL,它应该可以访问API代码和API中链接的所有库. 我的问题是,在API中,我可以访问我链接的所有库的所有功能.但是在实际项目中,将API作为依赖关系,我可以调用函数,并且编译器没有抛出(原因)的错误,因为函数声明在链接的标头文件中,但是链接器在该功能中找不到. DLL,这意味着API的构建不会导出链接的库中的dll. 在API项目中,我还定义了必要的预处理器定义: 我定义了_GLFW_BUILD_DLL: from "glfw3.h" l. 233-245 /* GLFWAPI is used to declare public API functions for export * from the DLL / shared libra
8 2023-12-06
编程技术问答社区
如何dllexport一个源自std::runtime_error的类?
我已经设置了一个库,该库提供了从标准异常派生的异常类: #include #include 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 #include class MY_EXPORT BaseException : public std::runtime_error { public: BaseE
6 2023-12-05
编程技术问答社区
在DLL中导出静态数据
我有一个dll,其中包含一个静态成员的类.我使用__declspec(dllexport)来利用此类的方法.但是,当我将其链接到另一个项目并尝试对其进行编译时,我会得到静态数据的"未解决的外部符号"错误. 例如. 在dll中,test.h class __declspec(dllexport) Test{ protected: static int d; public: static void m(){int x = a;} } 在dll中,test.cpp #include "Test.h" int Test::d; 在使用测试的应用程序中,我致电M(). 我还尝试单独使用__declSpec(dllexport),但我仍然会为静态成员遇到相同的链接错误. 如果我使用dumpbin检查dll(.lib),我可以看到符号已导出. 例如,该应用在链接时间给出以下错误: 1>Main.obj : error LNK2001:
2 2023-12-05
编程技术问答社区
如何建立libjpeg 9b的DLL版本?
我想构建libjpeg 9b的DLL版本.根据文档 ps:我从 http://www.ijg.org.org/files/下载了libjpeg 9b的来源. .这是下载它的官方场所吗?我问,因为.vcxproj(最初是.v10)文件的开始字节似乎无效(C2 8B C2 AF C2 A8),因此Visual Studio无法打开它. 解决方案 在 就像如今几乎所有的软件一样, libjpeg 也托管在 [github]:winlibs/libjpeg -libjpeg -9b .我从两个地方下载了它,进行了比较,只有很少的差异(源代码中的任何一个)弹出.我将在 github 版本上进行解释.不幸的是,此处没有演练,因此我必须在其中一些文件中查看以找出必须做什么.这是一个步骤列表: 1.准备地面 1 st 事物是提取压缩( .zip / .tar.gz )文件内容到一个文件夹中(并且有一个 cmd 控制台在那里打开).该文件夹包含许多文件.我们需要的1 st 是 mak
12 2023-11-24
编程技术问答社区
在VS2010中导出DLL的问题(CUDA)
我在构建DLL解决方案时遇到了麻烦.为了具有CUDA功能,我正在制作用于Labview 2010的DLL.但是,我在我想要导出的每个功能中都会收到链接器错误lnk2019. #include "LVCUDA.h" #include "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\cufft.h" #include "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include\cuda.h" #include #include #include BOOL WINAPI DllMain ( HANDLE hModule, DWORD d
8 2023-11-23
编程技术问答社区
Visual Studio 2008的发布版本不能装饰DLL的导出
我正在Visual Studio 2008中构建C ++ DLL,以由Borland C ++构建器编写的C应用6使用. 我的调试DLL构建了带有下划线的导出方法.但是,在我的版本中,DLL构建方法并未装饰,从而导致C ++构建器中的链接错误. (有关dumpbin.exe的输出,请参见下面的两种构建类型) 我已经检查了调试和发布配置的编译器选项,但看不到任何可能引起此问题的内容. 我已经解决了问题.将Visual Studio .lib文件转换为C ++构建器的Borland Tool Inplib可以添加下划线.但是我想了解为什么出口没有装饰. 标题文件方法.h #ifndef METHODS_H #define METHODS_H #ifdef ENCRYPTION_EXPORTS #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __declspec(dllimport)
2 2023-11-23
编程技术问答社区
在Visual Studio中自动生成一个DLL .DEF文件?
有什么方法可以自动生成Visual Studio中DLL的DEF文件?我一直以前只是手动创建它们,但是有一个更简单的方法. 解决方案 我在这里找到了一个为您生成.def文件的地方:此功能令人惊讶,并且除了功能和符号的方法名称外,还可以生成一系列选项列表. 其他解决方案 简单地说:编写一个适合您需求的脚本.我是一个在某些地方创建一个小的perl脚本,以创建.def file 从创建现有的dll,然后将其用于从中创建导入库(.lib). 没有读取工具可以为您执行的读取工具的原因是,涉及的任何工具都无法猜测或以某种方式确定您要导出的功能,变量或常数或类别的函数,变量或类别. 您可能知道模块定义文件允许您更改内部名称在导出表中显示的方式,允许按序数(而不是名称)或名称和序数导出.当然,它们还允许多次导出功能(例如,由于旧名称而引起的旧名称,而较新的名称现在遵循一些约定). 另请参阅这个问题.您会注意到答案还涉及自定义脚本.在这种情况下,这种要求显然只是脱词和导出任何
16 2023-11-20
编程技术问答社区
MSVC未解决的外部符号链接可执行文件
我有两个现有的可执行文件A和t,在我触摸它们之前都很好的解决方案.在可执行文件中,A是定义P类的标题,也是静态实例MYP的原型.这些定义是在项目A中编译的.在可执行的t中,我想在项目A中调用MYP的成员函数,因此我将dllimport/enterm acros添加到了类和MYP的声明中,并在标题(不是定义)和MYP中添加包括项目T中的标题.DLLIMPORT/EXTORT宏是标准的,并且在项目A中定义了A_EXPORTS,但在T. 中未定义. #ifdef A_EXPORTS #define A_API __declspec(dllexport) #else #define A_API __declspec(dllimport) #endif //various definitions and includes, defining ENUM_RECORDING_TYPE and ERROR A_API HFILE viosopen(const _TCHAR *path, ENUM_
4 2023-11-20
编程技术问答社区
DLL:作为C/C++函数导出?
我从C ++代码中生成了Visual的DLL.依赖性沃克(Walker)将3个功能导出为C函数. 我做了一个SCONS项目来进行生成DLL,而3个功能中有2个不被视为C函数. 是什么使一个函数被视为或C ++函数,而无需修改代码?它必须在编译/链接选项中,但我没有找到任何相关的东西. 该函数由宏前缀:am_lib_export 在.h中,我有: #ifdef _WIN32 #define AM_LIB_EXPORT __declspec(dllexport) #else #define AM_LIB_EXPORT #endif // _WIN32 谢谢. 解决方案 是什么使一个函数被视为或C ++函数,而无需修改代码? 由C ++编译器编制的功能自动是" C ++函数",并且会发生名称响应以解决C ++功能,例如命名空间和过载. 为了获取" C"导出名称,必须在函数声明中使用上述extern "C"预选程序.或者,在包含原型的标头周围的
2 2023-11-20
编程技术问答社区
使用dll导出类的__declSpec(dllimport)未解决的外部符号(dllimport)
我想根据DLL导出的类定义派生类.基类在项目A中定义,派生类位于项目B中. 首先,在项目A中,定义了预处理器mydll_build.我使用标头文件指定导出/导入: #if !defined(MYDLL_BUILD) # pragma comment(lib, "myDll.lib") #endif #if defined(MYDLL_BUILD) # define MYDLL_API __declspec(dllexport) #else # define MYDLL_API __declspec(dllimport) #endif 然后我定义基类: class MYDLL_API DllObject { public: virtual ~DllObject() {} protected: DllObject() { m_count = 3; } private:
16 2023-11-20
编程技术问答社区
不一致的dll链接和dllimport静态数据成员的定义不被允许
假设我有这两个文件: header.h class DLL ExportClass{ public: ExportClass(); static int test; }; source.cpp #ifdef EXPORT #define DLL __declspec(dllexport) #else #define DLL __declspec(dllimport) #endif #include "Header.h" int ExportClass::test = 0; ExportClass::ExportClass(){ } 我不会定义EXPORT(要用static成员导入已经导出的类),为什么我会收到这些警告: 1>source.cpp(11): warning C4273: 'test' : inconsistent dll linkage 1> header.h(4) : see previous
8 2023-11-20
编程技术问答社区
使用extern c和dllexport与模块定义的stdcall名称混淆(msvc++)
我试图导出一个简单的测试功能,以使DLL与应用程序(FYI:MIRC)一起使用,该应用程序指定调用约定为: int __stdcall test_func(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause) 现在,要从应用程序调用它,我会使用 test_func ,但我注意到由于名称而注意到它并不像我想象的那样简单. 通过类似的主题,我已经了解到,使用 extern" c" 与 __ extspec(dllexport)结合使用是一种emove夫的方法到模块定义(.def).但是,当使用extern/dllexport方法时,我的函数(例如)始终 _test_func@numbers ,而.def删除了与我需要导出到的应用程序所需的所有操作. 有人可以解释为什么这是吗?我只是对这两种方法感到好奇.谢谢! 解决方案 dllexport/导入设计为自己加载,而不是使用getP
6 2023-11-20
编程技术问答社区
使用UnmanagedExports软件包[DLLEXPORT]在VBA触发器中调用C#DLL"找不到DLL入口点"错误
我正在使用 Robert Giesecke's 未经管理的出口套件来访问Excel VBA中的C#dll.我遵循了几个示例,并继续获得运行时错误453:"在mydllname.dll中找不到入口点mydllfunction" 我使用64位Excel在64位机器上,并将X64的DLL包装. 我在Visual Studio 2022工作,并尝试在.NET 6.0和.NET Framework 4.7.2. 中准备DLL. 这是我的出口课: namespace MyNamespace { public static class UnmanagedExports { //entry point for dll static UnmanagedExports() { //nothing } [DllExport("HelloWorld", Calling
2 2023-11-16
编程技术问答社区
通过Excel/VBA调用DLL中的C++函数,在传递双参数时产生异常
我正在尝试通过DLL在Excel/VBA中使用C ++静态函数. 在VS17中调试时,我会得到一个例外,我怀疑这是通过参数通过的方式(这是双重) 的问题 excel.exe中的0x00007FFA28BBA14F(kernel32.dll)的例外: 0xc0000005:访问违规阅读位置0xfffffffffffffffffffff. 这是我的C代码: test.h extern "C" __declspec(dllexport) double get_sum_cpp(double x); test.cpp double WINAPI get_sum_cpp(double x) { double res = x + x; return res; } VBA中的声明: Declare PtrSafe Function get_sum_cpp Lib "C:\Users\bbi\source\repos\Test\x64\Deb
4 2023-11-16
编程技术问答社区
在VB6中使用C++ DLL
我刚刚在MSVC ++ 2010中为老板创建了一个DLL.我选择了带有选项"导出符号"的"新Win32 DLL",因此,一切都是标准的.新项目文件,类,构造函数,一个全局函数和带有虚假值的全局函数和带有Apientry函数的文件dllmain.cpp中有一些预定义的导出.我什么都没有改变. 现在,我的老板想在他的VB6项目中使用导出的东西.他启动了一个VB6项目,做菜单"项目" - "链接"(从德语翻译到英语,所以可能有所不同,但我敢肯定您知道我的意思)并选择了一个DLL文件,就像他说他说的那样通常这样. 但是,VB6无法包括它,而是显示错误消息"不能包括DLL文件"(没有给出的实际原因).来自Visual C ++ 6的标准新DLL项目也发生了同样的情况.我的老板认为这可能是因为符号并未真正导出,或者VB6需要一些特殊的声明.有人知道问题是什么吗? 解决方案 是的,VB6无法正常工作.您需要在VB代码中声明DLL函数有些类似: Private Declare
2 2023-11-15
编程技术问答社区
如何从VB.NET向用C++编程的DLL传递一个字符串到const char *?
我以这种方式创建了C ++导出的功能: extern "C" __declspec(dllexport) int __stdcall AlmacenarPedidoLipigas(const char * pszTelefono, const char * pszFechaPedido, const char * pszHoraPedido, const char * pszCodigoInterno, const char * pszDescripcionProducto, const char * pszCantidadProducto, const char * pszValorUnitario, const char * pszFechaEntrega, const char * pszHoraEntrega, const char * pszKilosProducto,
12 2023-11-14
编程技术问答社区