将32位.def文件转换为64位

问题描述:

在我公司,我们使用.def文件来指定需要导出的符号。 (我希望我可以使用更现代化的自动化技术,不幸的是,那些决定在八十年代生活的人)。将32位.def文件转换为64位

手动编写.def文件,使用手动复制粘贴是无聊和容易出错,但到目前为止,我可以忍受它。

但是,我需要为64位版本的DLL编写类似的.def文件。几个函数的名称修饰发生了变化,我想知道是否有办法从32位版本生成64位版本的.def文件。

您知道有任何可以帮到您的工具吗?这是否现实?我真的不觉得我想再一次手动做它。任何解决方案,甚至包括编码我自己的工具的解决方案都是受欢迎的

谢谢。

+0

嘿,我还活着回到80年代呢! – 2011-01-05 16:47:24

我可能会__declspec(dllexport)我想要的符号,编译,然后在生成的DLL上运行dumpbin/exports来获取重名的名称,然后您可以删除__declspec并生成一个.def文件。

+0

+1。感谢这个想法。听起来很有效。不过,我想尽量减少对源代码的修改。我想用宏来有条件地放/删除'__declspec'语句而不修改源代码应该工作? – ereOn 2011-01-05 15:30:09

+0

添加一个宏或添加__declspec将会将代码更改为相同的数量。我没有看到任何风险。 但是,如果你真的不想改变代码,我想你可以将它编译为调试,加载一个EXE,将DLL上的loadlibrary加载到windbg中并执行“x Mymodule!*”,它将列出所有符号,然后你可以从那里选择你想要的。 – jcopenha 2011-01-05 15:37:33

告诉你的老板回到80年代。严重的是,这不是导出符号名称的便携方式。如果C++编译器更改名称修改方案会怎样?然后你必须重新做这个(jcopenha说的)。如果你不在那里工作会发生什么?另一个可怜的灵魂将不得不花费宝贵的时间来了解什么以及如何去做?我会尽量说服老板使用__declspec(dllexport)。它现在可以节省时间,并可能在未来的时间。

我假设你正在导出类和重载函数。如果你不是,那么我会用C名字来导出函数。这些名字不会被破坏,也不会改变。

+0

我确实在出口类。他们希望使用'.def'文件来“隐藏”函数名称,并使用序数代替(以防止用户猜测导出哪些函数......)我相信这是一个可怕的原因,它不会阻止任何天才“黑客”找到功能签名。 – ereOn 2011-01-05 19:08:16

+0

哎。那么,我会尝试在构建过程中自动化它。创建一个使用__declspec()的单独构建解决方案(隐藏在一个在常规构建中无法展开的宏中)。在输出上运行dumpbin,并根据dumpbin结果创建一个.def文件,并将其合并到项目中。这样它就相当自动化了,如果你切换到不同的编译器就不会炸掉。你只需要记住使用宏。 – 2011-01-05 20:03:24

+0

我不明白关于引入DEF文件问题的名称修改方案更改的评论背后的推理。我认为DEF文件是一种避免命名重写更改问题的方法,因为当您使用dllexport时,会得到重名的名称,但是当您使用DEF文件时,您可以指定名称,并且它们会进入未被重定向的出口我的经验。 – BlueMonkMN 2017-05-03 15:38:51