1

我试图从 COM dll 的序号中获取实际的函数名称。我尝试使用dumpbin.exe,但它只返回[NONAME]每个序数(前几个除外)。

    序号提示 RVA 名称

         21 0 00002439 DLLCanUnloadNow
         25 1 00007F41 DllGetClassObject
        116 2 0000539C DLLMain
        138 3 00008633 DllRegisterServer
        176 4 00008640 DllUnregisterServer
          1 0009152E [无名]
          2 00154CA7 [无名]
          3 00154C0B [无名]
          4 000140C9 [无名]
        ...

包含 .dll 文件的目录不包含任何其他文件(*.tlb、*.lib、*.def)。

有人可以告诉我如何获取这些列表吗?或者至少使用注册表或其他东西的特定序数的名称?

[编辑:附加信息] 我找不到 COM dll 的 .def 文件,所以我无法使用它来获取名称。我对实例化 COM 类不感兴趣,我只想知道与指定序数相关的函数。

我原来的问题是我使用WinDbg发现了一个异常,发生在ChartFXClientServerCore!Ordinal5507(+0x97b7),所以想看看具体的函数来尝试隔离问题。

4

2 回答 2

2

您可以使用 OleView 工具 (OLE/COM Object Viewer),它随 Windows SDK 一起提供,http://www.microsoft.com/downloads/details.aspx? FamilyId=F26B1AA4-741A-433A-9BE5 -FA919850BDBF&displaylang=en。在该工具中,转到 File->View TypeLib,然后浏览到您的 DLL。

编辑:针对关于 DLL 序号与 typelib 公开的方法名称之间关系的问题的回答:通过 COM 公开的方法也通过 DEF 文件或通过 __declspec(dllimport) 公开并不太常见。通常,在通过 CoCreateInstance() 或类似方法创建相应的类之后,您可以通过其 IUnknown 派生接口访问 COM 方法。

DLL 的程序员也可以选择在 DEF 文件中公开一些 COM 方法,但 AFAIK 找出映射的唯一方法是查看 dumpbin /exports 的输出,取消修饰返回的名称(使用 undname .exe) 并在 typelib 中直观地找到对应关系。

于 2009-03-16T08:47:31.803 回答
1

如果您的 COM 组件未标记为可安全编写脚本,则 OLEView 很可能没有任何真实信息(即不能从脚本中调用它,因此有关如何调用它的所有信息(类型库)都通过空闲)。

mIDA这样的东西可以为您提供大部分信息。你也可以在woodmann上搜索openrce,寻找 NDR RPC IDL,试试 symbolviewer。(RIP fravia)。

于 2009-07-18T14:12:51.353 回答