让我参考一下 https://msdn.microsoft.com/library/24awhcba(v=vs.100).aspx#Anchor_1
他们在说
如果成功则返回零;失败时的错误代码。如果pValue是 NULL,调用无效参数处理程序,如中所述 参数验证。 如果允许继续执行,请执行此操作 function将errno设置为EINVAL并返回EINVAL。
但是我的程序刚刚死了而不是返回errno。 有没有人知道如何让程序返回errno?
代码,
#include <stdlib.h>
char* pPath;
if( _get_pgmptr(&pPath) != 0 )
return false;
答案 0 :(得分:1)
除非我在帖子中遗漏了某些内容,否则这是一个可以更改的CRT安全功能。来自MSDN:
大多数安全性增强的CRT功能和许多预先存在的功能验证了它们的参数。这可能包括检查指针为NULL,检查整数是否落入有效范围,或检查枚举值是否有效。找到无效参数时,将执行无效参数处理程序。
默认无效参数调用Watson崩溃报告,这会导致应用程序崩溃,并询问用户是否要将崩溃转储加载到Microsoft进行分析。
如果您希望在此之后继续而不是崩溃,则解决方案是使用_set_invalid_parameter_handler设置无效参数处理程序。
来自MSDN的示例针对问题中的用例进行了调整:
// crt_set_invalid_parameter_handler.c
// compile with: /Zi /MTd
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h> // For _CrtSetReportMode
#include <errno.h>
void myInvalidParameterHandler(const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
// it's a good idea to keep some logging here:
printf("Invalid parameter detected in function %s."
L" File: %s Line: %d\n", function, file, line);
printf("Expression: %s\n", expression);
// no abort
}
int main()
{
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
_get_pgmptr(NULL);
assert(EINVAL == errno());
return 0;
}
但是,请记住,全局适用于您的程序中的所有参数验证,因此这可能不是一个好主意。在调用函数之前检查参数会好得多,因为这会在全局范围内保留更安全的参数验证。您可以通过这种方式获得相同的errno
值:
if (pOut)
{
_get_pgmptr(pOut);
}
else
{
_set_errno(EINVAL);
}
答案 1 :(得分:0)
看看这个。
在Win10更新之后,似乎MS更改了VC运行时。 就我的情况而言,更新后, 使用VS2010 _get_pgmptr()很好。 VS2015会崩溃..
使用GetModuleFileName()代替_get_pgmptr()。