我有一个托管 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
。