Visual studio 可以在VS2008中调试COM dll吗?

Visual studio 可以在VS2008中调试COM dll吗?,visual-studio,debugging,com,com-interop,Visual Studio,Debugging,Com,Com Interop,这可能是一个非常愚蠢的问题。 可以在VS2008中调试没有源代码的COM dll吗 我之所以要这样做,是因为我正在将一个数组传递给一个COM方法,我希望该数组由该方法填充。 但是,未填充阵列。所以我想进入COM方法,看看发生了什么。这可能吗 下面是我正在使用的代码示例: Array binaryArray = Array.CreateInstance(typeof(sbyte), 896); bool success = photo.GetBinaryData(binaryArray); Ge

这可能是一个非常愚蠢的问题。
可以在VS2008中调试没有源代码的COM dll吗

我之所以要这样做,是因为我正在将一个数组传递给一个COM方法,我希望该数组由该方法填充。
但是,未填充阵列。所以我想进入COM方法,看看发生了什么。这可能吗

下面是我正在使用的代码示例:

Array binaryArray = Array.CreateInstance(typeof(sbyte), 896);
bool success = photo.GetBinaryData(binaryArray);
GetBinaryData
方法的IDL:

[id(0x000000c9)]
HRESULT GetBinaryData(
                [in] SAFEARRAY(char) buffer, 
                [out, retval] VARIANT_BOOL* retval);
GetBinaryData
方法是我想介绍的COM方法

编辑:添加一个有效的Delphi测试脚本

procedure TComTestForm.TestUserBtnClick(Sender: TObject);
var
  nCnt :integer;
  User :IUser;
  Persona :IUserPersona;
  ArrayBounds :TSafeArrayBound;
  ArrayData :Pointer;
  TagList :PSafeArray;
  nSize :integer;
begin
  User := Session.GetUser;

  ArrayBounds.lLbound   := 0;
  ArrayBounds.cElements := 0;

  TagList := SafeArrayCreate( varInteger, 1, ArrayBounds );
  User.GetTags( TagList );
  if SafeArrayAccessData( TagList, ArrayData ) = S_OK then
    begin
      nSize := TagList.rgsabound[0].cElements;
      OutLine( '----Available Tags, ' + IntToStr(nSize) + ' tags' );
  for nCnt := 0 to nSize - 1 do
    begin
  OutLine( IntToStr( IntegerArray(ArrayData)[nCnt] ) );
end;
大纲('---')

安全访问数据(标记列表); SafeArrayDestroy(标记列表); 结束


结束

原则上,是的,您可以一条指令一条指令地逐步完成COM方法实现的代码

然而,即使您非常了解汇编,并且确切地了解所有处理器指令是如何工作的,以这种方式调试其他人的代码也是一项艰巨的任务,除非它是一种非常非常简单的方法

如果你对汇编程序很陌生,就不要考虑它,除非你准备先学习几周的学习曲线。p>


如果COM方法的工作方式与您根据其文档所期望的不一样,我将首先尝试使用非托管代码(例如C++)测试该方法,因为您的问题可能在于COM互操作封送,而不是COM方法本身

我想这是可能的,只要你不介意在汇编程序中进行(COM dll不太可能嵌入符号)。@forsvarir:谢谢你的回答。我将如何在汇编程序中实现这一点我以前从未使用过。你能给我指出正确的方向吗?@shane87:我还没有测试过,所以它可能不起作用,但是。。。在“photo.GetBinaryData”行上设置一个断点,并将代码运行到该断点。当代码中断时,右键单击源代码窗口并选择“转到反汇编”。使用普通的F10/F11键进入通话。您似乎无法单步执行所有调用(我猜它们是内核代码),而且我没有可以测试它的com dll,因此它可能无法工作。。。我也有点怀疑,如果它真的起作用,它会对你有很大帮助…@shane:COM服务器通常包含一个类型库资源,它提供关于它们公开的COM类型的元数据。您可以使用诸如Microsoft SDK OLE-COM对象查看器OleView.exe之类的工具查看类型库(可以将其放在VS tools文件夹中)。IDL(接口定义语言)是用于定义COM类型等的语言。OLEView工具将向您显示所使用接口的IDL。该方法的IDL将准确地告诉您该方法期望和输出的COM/非托管类型。@shane:只有COM方法的作者才能告诉您在调用该数组时该数组应该是什么样子。你说你有一些Delphi测试代码可以工作。。。那有什么用?不过,经过反思,我认为您有一个更基本的问题:由于COM方法签名接受
[in]SAFEARRAY(char)
(特别是[in]位),我认为这无法在不破坏SAFEARRAY语义的情况下填充客户机分配的数组。如果我是对的,Delphi代码是偶然工作的。我非常怀疑您能否说服.NET COM Interop也这么做。谢谢您的回复。因为我不知道,所以我就不说了。COM dll是用Delphi编写的,并用Delphi代码进行了测试,该方法运行良好。我想我的问题在于互操作编组。我能做些什么来进一步调查这件事吗?提前谢谢。