0

win32 APIを使用してファイルを作成する関数を書いています

void createFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC)

また、現在の時刻に基づいてファイル名を動的に生成する関数も作成しました。

char * getFilename() {
   char filename[200] = "";
   char buf[40];
   SYSTEMTIME st;
   GetSystemTime(&st);
   itoa(st.wHour, buf,10)
   strcat(filename,buf);
   .....
   return filename;
}

上記の関数を次のように呼び出します。

createFile(hwnd, getFilename, pbi, hBMP, hDC);

デバッガーを通過すると、createFile() の最初のステートメントが実行されるまでファイル名は正しく、文字列は突然「ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ」になります

ある種の型エラーがあることは明らかですが、それを修正する方法がわかりません。私は win32 API を初めて使用し、使用されているさまざまな型を理解するのに苦労しています。この問題を解決するための助けをいただければ幸いです。

4

1 に答える 1

1

filename内部のスタックに割り当てられているgetFilenameため、関数が戻ると解放されるへのポインターを返しています。

編集:混乱を避けるために-メモリはヒープではなくスタックに割り当てられます(mallocまたはを介してnew)。freeしたがって、「解放される」とは(または)を呼び出すことを意味しませんdelete。むしろ、予約されなくなったという事実に。もう使用できません。割り当てを解除しました。バイトの喪失。これは非バッファです。

解決策として、 の外にメモリを割り当てることを検討してgetFileNameください。これは、バッファーをパラメーターとして渡す呼び出し元によってスタック上で実行できます。当然、文字列クラスの使用はオプションです。

于 2012-05-29T18:30:25.340 に答える