是否可以在VS2008中调试COM dll?

时间:2011-05-06 10:26:19

标签: visual-studio debugging com com-interop

这可能是一个非常愚蠢的问题 是否可以在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;

OutLine('----');

SafeArrayUnAccessData(TagList);   SafeArrayDestroy(TagList);     端;

端;

1 个答案:

答案 0 :(得分:3)

原则上,是的,您可以逐个指令逐步执行COM方法实现的代码。

然而,即使你很了解组装并且完全理解所有处理器指令的工作方式,以这种方式调试别人的代码也是一个很高的要求,除非它是一个非常非常简单的方法。

如果您不熟悉汇编程序,除非您准备好先学习数周的学习曲线,否则不要考虑它。

如果COM方法似乎没有按照你期望的方式工作,我将首先尝试使用非托管代码(例如C ++)测试方法,因为你的问题可能在COM Interop编组中而不是在COM方法本身。