【发布时间】:2011-06-26 12:29:36
【问题描述】:
我有一个不使用标准库的应用程序。相反,它使用存根调用 LoadLibrary/GetProcAddress,然后通过生成的函数指针调用函数。
使用上述方法,我的应用程序在 ole32.dll 中调用 DoDragDrop。该调用返回 E_UNEXPECTED,这显然意味着“灾难性故障”。
我想问的是,有没有人知道一种方法来发现对 DoDragDrop 的调用中发生了什么?具体来说,我能否发现它正在寻找但找不到的函数或变量? (我猜它想要访问一些在我调用 DoDragDrop 时未加载的函数或变量,如果我可以显式加载它,调用将成功。)显然我无法进入调用 - 试图只是在 DoDragDrop 调用之后运行函数并执行到我的代码中的行。
:)
(我在 XP 中使用的是 VS2005。)
【问题讨论】:
-
我不能说我真的建议,但如果你切换到反汇编窗口,然后单步,你可以进入(至少是用户模式部分)系统调用.但是,除非您相当习惯于汇编语言,否则它可能对您没有多大用处。
-
这很简洁,但无济于事,因为这对我来说都是gobblygook!但它让我进入系统符号文件,我目前正在从 MS 下载一组。我希望它能在反汇编列表中添加一些我能理解的东西......
-
...好吧,我已经得到了符号,并且我一直在单步执行代码,现在这很有意义。它看起来像一个名为 GetMarshalledInterfaceBuffer 的函数中的 CoMarshalInterface 函数失败(这些都在 ole32.dll 中)。我认为我的界面可能有点塞满。 AddRef 等可能不在我的对象的前面,我认为 COM 需要它,尽管我以前从未因为它而失败过。我现在头好痛!所以我想明天我会回来讨论...
-
你把
AddRef放在哪里并不重要,只要你从IUnknown继承(你应该这样做)。由于它将AddRef放在第一位,因此您的覆盖将保持在第一位。
标签: c++ visual-studio dll com