是否有可能find在DLL中声明的结构的大小?

我们有这样的情况:我们有大量的相互关联的DLL来组成我们的产品。 这是一个非常“古老”的产品(就像它已经发展了20年),过去由于Visual Studio的几个版本的结构包装的不同默认设置而遭受了损失。

所以,在DLL头文件中没有使用#pragma pack情况下,但是在项目属性中已经设置了结构alignment的情况下,我们可以得到这样的情况:导入DLL的项目(通过它的lib和头)具有不同的结构alignment,并可能导致结构尺寸不匹配。

这很复杂的事实,结构可以通过“事故”正确的大小 – 例如,如果结构的所有成员都是unsigned int然后pack(4)在DLL和pack(2)在导入项目可以正常工作。 当然,直到有人修改一个结构来添加一个bool例如。

我想通过将#pragma pack语句添加到所有导出模块的头文件中来消除所有这些潜在的混淆,但是首先要评估我们当前代码中是否有这样的暴露(考虑难以跟踪的运行时错误这里)。 另外,在我们的构build过程中引入一些自动检查以确保我们永远不会遇到这种情况,即使使用第三方DLL或LIB也是有用的。

所以,我的问题是:

从编译的DLL或其关联的LIB中,可以确定在编译DLL时哪些结构alignment是有效的? 同样,是否有可能发现这个EXE?

我想知道的是,如果有什么PE格式或LIB(是COFF?)可以用来find这些信息?

UPDATE

那么,使用dumpbin检查libs和dll是没有好处的,所以我将尝试从我们的Release版本生成的PDB文件中获取一些信息。 我觉得这是一个起点…

我会说这是不可能的。 C ++没有应用类型信息(除非使用RTTI启用,但对这个问题没有太大的帮助)。 结构只不过是程序员的一个字节序列。 编译器将用适当的字节对齐来替换variable.member来访问这些数据。

我怀疑你有正确的调试信息(即PDB文件)的DLL查找符号。 即使如此,也不可能找到一个结构的“包装”。

我在不同的EXE / DLL(具有完整的源代码)中遇到了结构大小的问题,其中sizeof只是我们可以用来查找差异的工具(并且嵌套查找问题的根源)。 即使采用这种技术,也不可能为特定结构启用哪种包装。