快速一:结构成员的获取处理地址
Quick one: GetProcAddress of Struct member?
假设我在DLL中有以下结构定义:
typedef struct {
double varOne;
double varTwo;
} structOne;
structOne myStruct;
然后,可以从加载 DLL 的主应用程序中执行以下操作:
structOne * sPtr = (structOne *)GetProcAddress(libraryHandle, "myStruct");
我的问题是是否有可能做以下事情:
double * dPtr = (double *)GetProcAddress(libraryHandle, "myStruct.varOne");
- 如果你明白我想要什么,这是可能的;语法是什么?
- 如果不可能,为什么?
- 如果您不理解我的问题;请在评论中说出来!
问候并希望得到答案!
不,这是不可能的。 GetProcAddress
只能访问动态链接器信息。有关类/结构布局的信息是编译器信息的一部分。编译器将此信息放入 PDB 文件中。它不直接存在于二进制模块中。 GetProcAddress
只能访问存储在 EXE/DLL 文件中的信息。PDB文件主要由调试器使用,很少有例外,如StackWalk
。
事实上这是不可能的,因为使用 GetProcAddress 访问的函数(符号)只是导出地址表导出的函数(符号)!
正如其他答案中提到的,这是不可能的。
为了解决您的问题,您可以从 DLL 导出结构定义,导出返回全局变量地址的全局函数。从 exe 中,导入此函数并调用此函数以获取指向 dll 中定义的全局结构对象的指针。代码如下...
添加一个 structOne.h 文件并将结构定义移动到该文件。修改定义,如下所示
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
struct TESTDLL_API structOne{
double varOne;
double varTwo;
} ;
将C++预处理器宏TESTDLL_EXPORTS添加到 DLL。
在 structOne.cpp 文件中定义一个这样的全局函数并将其导出。
structOne myStruct; // your global variable
TESTDLL_API structOne* getStruct(){return &myStruct;}
然后生成 DLL。
从.exe,使用以下代码调用该方法。此外,包括 structOne.h 头文件
typedef structOne* (*getStruct)();
HMODULE libraryHandle = ::LoadLibraryA("TestDLL.dll");
getStruct fn = (getStruct)::GetProcAddress(libraryHandle, "getStruct");
structOne* s = (*fn)();
偏移量本身 (0) 隐式存在于 DLL 中,但对应于该偏移量 ( ".varOne"
) 的符号不是。
解决方法:
struct member_t { char const* type; char const* member; size_t offset };
#define MEMBER(T, M) {#T, #M, offset_of(T, M) }
member_t exports[] = {
MEMBER(myStruct, varOne)
};
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在 c++ 窗口中将参数和返回的退出值传递到批处理文件/从批处理文件获取返回的退出值
- 从处理程序捕获时如何获取 Ada 异常消息C++?
- 如何处理在 bash 文件中获取运行时输入的 c++ 程序
- 从后台处理程序获取作业 - C++
- 获取特定监视器的处理程序以在其中放置弹出窗口
- 使用非静态消息处理程序获取GSTREAMER总线消息
- 无法获取程序来处理WM_PowerBroadcast消息
- 如何获取函数以在 Main() 中重新处理变量
- 从 exe 获取输出C++并在 Python 中实时处理它
- 使用Arduino Due从MPU-6050获取/处理正确的值U
- 如何在自定义信号处理程序中以编程方式获取sigterm的默认行为
- C++ Opencv - 通过套接字获取后的图像处理
- 如何获取对话框的处理程序(HWND)
- 处理POSIX信号:如何在不使用BackTrace_symbols的情况下获取堆栈跟踪
- 有没有一种方法可以获取在处理信号期间访问的指针
- 最有可能使用的方法是处理多个键以使用STL容器获取值
- 在数据流处理程序中获取segfault
- 快速一:结构成员的获取处理地址
- C++ 获取处理地址不起作用