2010-08-12 97 views
2

我使用_itoa_s_ultoa_s時遇到了一個奇怪的行爲,如果我嘗試從DWORD獲取char數組。該函數返回零(成功),我的應用程序繼續,但我得到一個異常窗口,錯誤代碼0xc0000417 (STATUS_INVALID_CRUNTIME_PARAMETER)無效cruntime參數_itoa_s

ULONG pid = ProcessHandleToId(hProcess); 
int size = getIntSize(pid); 
char *pidStr = new char[size+1]; 
_ultoa_s(pid, pidStr, size+1, 10); 
//do sth with pidStr... 
delete[] (pidStr);` 

ProcessHandleToId返回PID (DWORD)對於給定ProcessHandle

getIntSize將數字的數量返回給相應的int/char數組(5555 => 4)。

+1

與問題無關,但應使用'delete []'。 – sharptooth 2010-08-12 12:14:20

+0

「..但我得到一個例外..」 - 什麼時候?你的代碼似乎是正確的,順便說一句。 – msteiger 2010-08-12 12:51:02

+0

我可以編譯我的代碼,我的應用程序似乎2運行。爲了給出更多的背景信息:這段代碼是調用NtTerminateProcess時調用的回調例程的一部分。我需要終止進程的processid。當我每次運行我的應用程序ultoa_s被稱爲我的應用程序中斷,我得到0xc000417異常blabla窗口....但函數返回0(成功)和正確的值(pid)存儲在pidStr ...它的駕駛我瘋了! 我在另一個例程中使用相同的代碼,它沒有任何問題。 – christian 2010-08-12 12:59:08

回答

2

是的,安全的CRT功能會在他們檢測到問題時以狀態碼0xc0000417中止程序。但是,他們會立即,功能不會返回。

這意味着您正在查看此問題的錯誤源代碼。這不是正在轟炸你程序的_ultoa_s()調用。這是另一個函數調用,在你的代碼中的其他地方。當然,我無法幫你找到它。但調試器應該給你一個好主意,當它打破時看看調用堆棧。

0

我剛編譯你的代碼,它運行良好。 int到字符串轉換是正確的。我假設您在嘗試訪問您不屬於自己的進程句柄時,由於缺少權限而遇到安全問題。

+0

正如我之前提到的:有趣的是,_ultoa_s返回成功,甚至在關閉異常窗口後給出了正確的char數組(pid作爲字符串)。在我的Dll的另一部分相同的代碼,它的工作沒有任何問題。 – christian 2010-08-12 13:36:40