在Win32 API中从命令行解析的字符的未处理exception

我必须解析命令行参数并将某些char转换为整数。

我有以下代码:

TCHAR *token1; token1 = strchr(cmd_line, L'+'); MessageBox(NULL, token1, _T("test"), NULL); //char *str = "+10 frogs"; TCHAR *endptr =" "; long n = strtol(token1 + 1, &endptr, 0); if (!*endptr) MessageBox(NULL, "No error", _T("test"), NULL); else MessageBox(NULL, "error", _T("test"), NULL); 

在命令提示符下发送命令“WesOPC.exe +10 -regserver”时,消息框显示“+10 -regserver”。

我需要将10存储为整数。因此,我使用了strtol但显示了带错误的messagebox。

当我试图调试它时,在行看到的错误

 long n = strtol(token1 + 1, &endptr, 0); 

 Unhandled exception at 0x0042d368 in WesOPC.exe: 0xC0000005: Access violation reading location 0x00000001. 

‘n’应该是10

你在内存地址0x00000001获得一个AV。 您正在向token1添加1。 这意味着token1为NULL,但您的代码没有检查该条件。 事实上,你对MessageBox()调用应该在那种情况下显示一个空白字符串。

另一个问题是你在同一个代码中将char*wchar_t*TCHAR*在一起。 token1使用TCHAR*L'+'使用wchar_tstrchr()需要char*char 。 你的代码甚至不应该按原样编译。 停止将数据类型混合在一起并选择一种类型来处理所有内容

试试这个:

 // where cmd_line is TCHAR*... TCHAR *token1 = _tcschr(cmd_line, _T('+')); if (token1) { MessageBox(NULL, token1, TEXT("test"), NULL); //char *str = "+10 frogs"; TCHAR *endptr = " "; ++token1; long n = _tcstol(token1, &endptr, 0); if ((n == 0) && (endptr == token1)) MessageBox(NULL, TEXT("error"), TEXT("test"), NULL); else MessageBox(NULL, TEXT("No error"), TEXT("test"), NULL); } else MessageBox(NULL, TEXT("param not found"), TEXT("test"), NULL); 

或者,停止支持Ansi并在所有内容上使用完整的Unicode:

 // where cmd_line is LPWSTR... LPWSTR token1 = wcschr(cmd_line, L'+'); if (token1) { MessageBoxW(NULL, token1, L"test", NULL); //char *str = "+10 frogs"; LPWSTR *endptr = L" "; ++token1; long n = wcstol(token1, &endptr, 0); if ((n == 0) && (endptr == token1)) MessageBoxW(NULL, L"error", L"test", NULL); else MessageBoxW(NULL, L"No error", L"test", NULL); } else MessageBoxW(NULL, L"param not found", L"test", NULL);