0
除了使用相同的接口和调用约定创建具有所有相同功能的dll之外,替换dll是否需要精确地复制包含原始序号的导出映射?所以不仅通过GetProcAddress显式加载,而且隐式链接也是如此?如何为现有的dll创建插入替换?
(编辑:这是一个非托管的,C/C++ Windows动态链接库我说的,不是.NET)
除了使用相同的接口和调用约定创建具有所有相同功能的dll之外,替换dll是否需要精确地复制包含原始序号的导出映射?所以不仅通过GetProcAddress显式加载,而且隐式链接也是如此?如何为现有的dll创建插入替换?
(编辑:这是一个非托管的,C/C++ Windows动态链接库我说的,不是.NET)
你需要每隔模仿任何其他客户使用的出口,你不需要模仿没有人使用的“死”出口。只有当其他客户端使用序号链接而不是导出名称(这很罕见)时,才需要保留序号。
有一些事情你需要记住:如果dll包含C++类,但它不使用extern“C”,那么你需要保持二进制可比性,这意味着替换dll中的类需要与原始类具有相同的字段顺序。如果您使用的接口需要使用每种方法的相同参数保留vtable。
谢谢!我没有想过上课。我认为我的特殊情况只是“C”函数,所以只需在.def文件中指定序号即可。我注意到在“dumpbin/exports”中还有一个“提示”列,这是否需要保存,或者可以不区分兼容性而有所不同? – Bogatyr 2010-04-09 17:52:52
哦,还有一件事。 “dumpbin/exports original.dll”包含多个相同入口点的条目:“foo”和“foo @ 4”,序号不同,但入口点相同。如何在导出地图中创建这些额外的“@n”别名? – Bogatyr 2010-04-09 17:54:38
@Bogatyr它的参数大小,foo表示没有参数foo @ 4是foo(int),foo @ 8表示foo(int,int) – 2010-04-09 18:20:38