我试图简化这一点,但如果您需要更多细节或代码,请告诉我。
首先,一些背景知识:我正在为 C++ 程序制作一个模块,使用从 .dll 导出的函数与它进行通信。我没有得到原始开发人员的支持,因此我无权访问源代码、标头、.lib 或其他任何内容。我使用依赖walker 来获取函数名称列表,并使用getProcAddress 显式链接大多数函数都成功。(这是我用来做到这一点的解决方案。)
现在我遇到的问题是如何处理未知结构。例如,我可以访问以下等式:
foo::bar::bar(void)
struct foo::bar magic(void)
foo::baz::baz(struct foo::bar const &)
int foo::baz::qux(void)
所以顶部函数是一个构造函数,它生成一个与结构同名的对象。第二个函数是一个魔术函数,它输出包含所有数据的结构。第三个函数是另一个构造函数,它使用该结构作为输入创建一个新对象。最后一个函数用刚刚创建的对象输出一个整数值(我真正关心的)。
如您所见,我不知道,也不关心结构中的内容。它只是被神奇地创建并立即传递给另一个处理它的函数。所以这就是我尝试处理它的方式(如果这没有意义,请查看第一段中链接的解决方案):
struct barStruct {
void** unknown1[1024];
void** unknown2[1024];
void** unknown3[1024];
};
typedef barStruct (*_magic) (char *);
typedef void (*_bazConstructor) (char *, struct barStruct const &);
typedef int (*_qux) (char *);
我想我知道 barStruct 中有多少元素,因为如果太多,bazConstructor 会崩溃。问题是,无论我怎么尝试,qux 都会崩溃。我猜这与我处理 barStruct 的方式有关。有必要这样定义结构吗?有没有办法将它从魔法直接传递给 bazconstructor 而无需说出其中的内容?
基本上:如果我不知道它应该包含什么,我应该如何处理一个结构?