0

我有一个托管 C++ dll,它用作Visual Studio 调试器的EEAddIn 。我的 dll 导出一个接受和返回非托管类型的函数。dll中函数的声明如下(DEBUGHELPER是一个普通的结构):

extern "C" 
{
#pragma unmanaged
  __declspec(dllexport) HRESULT CvMatViewer(DWORD dwAddress, DEBUGHELPER *pHelper, 
    int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved)
  {
    strcpy_s(pResult, max, "Value is processed");
    return S_OK;
  }
}

我的 dll 的目的是处理来自 Visual Studio 调试器的变量,并在显示在 Watch Window 之前以任意方式格式化它们(EEAddIn 的用途,非常酷)。

我启动了两个 Visual Studio - 一个用于我的托管 dll,一个用于本机调试的 exe。我可以将我的 dll 附加到运行本机 exe 的 Visual Studio 进程并设置断点。当用户在 Watch 窗口中添加变量时,我的断点被命中。我可以看到所有参数都正确传递并且函数工作正常,直到到达 return 语句。

之后,我有一个Unhandled exception at 0x51ea9de4 in devenv.exe: 0xC0000005: Access violation reading location 0x00000000.

同样适用于非托管 dll。那么有人能猜出问题隐藏在哪里吗?

两个 Visual Studio 都是 2010 版本。

是的,我可以使用非托管 dll 接受此调用,然后将控制权传递给另一个托管 dll,但奥卡姆剃刀原则告诉我不要这样做。

更新: pResult不是NULL,即使我注释掉也会抛出异常strcpy_s

4

2 回答 2

1

看起来您必须stdcall明确设置此函数的调用约定,这应该会有所帮助。

__declspec(dllexport) HRESULT __stdcall CvMatViewer(DWORD dwAddress, DEBUGHELPER *pHelper, 
    int nBase, BOOL bUniStrings, char *pResult, size_t max, DWORD reserved);
于 2012-07-03T20:55:48.143 回答
0

在将数据复制到其中之前,我会检查 pResult 实际上是否不是空指针。考虑到函数的大小,这很可能是你的问题。

于 2012-07-03T19:22:06.453 回答