Windows 如何为现有dll创建插入式替换?

Windows 如何为现有dll创建插入式替换?,windows,dll,map,replace,export,Windows,Dll,Map,Replace,Export,除了使用具有相同接口和调用约定的所有相同函数创建dll外,替换dll是否还需要精确复制导出映射(包括原始映射的序号)?因此,不仅通过GetProcAddress显式加载有效,而且隐式链接也有效 (编辑:我说的是一个非托管的c/c++windows dll,不是.net)您需要模拟任何其他客户端正在使用的每个导出,不需要模拟没有人在使用的“死”导出。只有在使用序号而不是导出名称链接其他客户端时,才需要保留序号(这种情况非常罕见) P>有一点需要记住:如果DLL包含C++类,并且不使用 ExtNe

除了使用具有相同接口和调用约定的所有相同函数创建dll外,替换dll是否还需要精确复制导出映射(包括原始映射的序号)?因此,不仅通过GetProcAddress显式加载有效,而且隐式链接也有效


(编辑:我说的是一个非托管的c/c++windows dll,不是.net)

您需要模拟任何其他客户端正在使用的每个导出,不需要模拟没有人在使用的“死”导出。只有在使用序号而不是导出名称链接其他客户端时,才需要保留序号(这种情况非常罕见)


<> P>有一点需要记住:如果DLL包含C++类,并且不使用<强> ExtNe>/St>>“C”,则需要保持二进制可比性,这意味着替换DLL中的类需要与原始类具有相同的顺序。如果您使用的接口需要为每个方法使用相同的参数来保持vtable。

您将需要模拟任何其他客户端正在使用的每个导出,您不需要模拟没有人在使用的“死”导出。只有在使用序号而不是导出名称链接其他客户端时,才需要保留序号(这种情况非常罕见)


<> P>有一点需要记住:如果DLL包含C++类,并且不使用<强> ExtNe>/St>>“C”,则需要保持二进制可比性,这意味着替换DLL中的类需要与原始类具有相同的顺序。如果您正在使用接口,则需要为每个方法保留相同参数的vtable。

谢谢!我没想过上课。我认为我的特殊情况只是“C”函数,所以只需在.def文件中指定序号就可以了。我注意到在“dumpbin/exports”中还有一个“hint”列,这是否也需要保留,或者可以在不破坏兼容性的情况下有所不同?哦,还有一件事。“dumpbin/exports original.dll”包含同一入口点的多个条目:“foo”和foo@4,位于不同的序号,但入口点相同。如何在导出映射中创建这些额外的“@n”别名?@Bogatyr参数的大小,foo表示没有参数foo@4是foo(int),foo@8表示foo(int,int)我正在为其创建的替换库同时具有“foo”和foo@X“导出表中相同入口点的符号。我必须在.def文件的导出部分创建指向单个条目点的别名条目谢谢!我没想过上课。我认为我的特殊情况只是“C”函数,所以只需在.def文件中指定序号就可以了。我注意到在“dumpbin/exports”中还有一个“hint”列,这是否也需要保留,或者可以在不破坏兼容性的情况下有所不同?哦,还有一件事。“dumpbin/exports original.dll”包含同一入口点的多个条目:“foo”和foo@4,位于不同的序号,但入口点相同。如何在导出映射中创建这些额外的“@n”别名?@Bogatyr参数的大小,foo表示没有参数foo@4是foo(int),foo@8表示foo(int,int)我正在为其创建的替换库同时具有“foo”和foo@X“导出表中相同入口点的符号。我必须在.def文件的导出部分创建指向单个入口点的别名条目