【发布时间】:2015-08-07 08:05:58
【问题描述】:
我在 Visual Studio 2010 中为我的 C++ 库创建了一个 C++ 测试项目。测试项目使用 C++/CLI (/clr set),我在检索我的库函数设置的最后一个错误时遇到问题; GetLastError 总是返回零。
在下面的示例中,我想测试我的 Write 函数是否设置了正确的返回值和最后一个错误:
[TestMethod]
void Write_InvalidHandle_Error()
{
char buffer[] = "Hello";
DWORD actual = -1;
DWORD expected = ERROR_INVALID_HANDLE;
int actualRetVal = 0;
int expectedRetVal = -1;
HANDLE handle = INVALID_HANDLE_VALUE;
actualRetVal = Write(handle, buffer);
actual = GetLastError();
Assert::AreEqual(expectedRetVal, actualRetVal);
Assert::AreEqual(expected, actual);
}
我检查了我的 Write 函数,它确实设置了正确的返回值和最后一个错误,但在我的测试方法中没有检索到后者。即使我将 Write 函数更改为仅设置错误并返回问题(并且在我的测试方法中调用 GetLastError 之前我没有调用其他函数):
int Write(HANDLE h, const char* buf)
{
SetLastError(ERROR_INVALID_HANDLE);
return -1;
}
知道如何解决这个问题吗?我认为 C++/CLI 存在问题,因为当我在此测试场景(纯 C++)之外使用我的库时,GetLastError 有效。
【问题讨论】:
-
能否提供Write函数的源码?
-
@LukasT 我添加了可能仍然会产生问题的最简单的实现。我认为问题与 C++/CLI 有关,因为我的代码在我不涉及它时(即不运行测试项目)可以工作。
-
所以归结为在c++-cli环境中调用SetLastError(VAL)而GetLastError返回0的情况?
-
是的,因为它在不使用测试项目时有效。
标签: visual-c++ c++-cli