• 締切済み

DlgDirSelectComboBoxEx

VC++2010 でMFCアプリケーションを作成しているのですが、 DlgDirListComboBox関数によって一覧が表示されているコンボボックスから、 現在選択されている項目(ディレクトリ名、ドライブ名)を取得する処理で、 DlgDirSelectComboBoxExを使用するとアプリケーションが強制終了してしまいます。 何が悪いのかが解らず困っています。 詳しい方がいましたらご教授お願いします。 以下は私が作成したサンプルコードとなります。 BOOL CComboBoxTestDlg::OnInitDialog() { CDialogEx::OnInitDialog(); CString work; work = L"C:\\*.*"; DlgDirListComboBox( work.GetBuffer(), IDC_COMBO1, 0, DDL_DIRECTORY | DDL_DRIVES | DDL_EXCLUSIVE); m_ComboBox.SetWindowText(L"C:\\"); } void CComboBoxTestDlg::OnCbnSelchangeCombo1() { wchar_t str[1024]; memset(str, 0x00, sizeof(str)); DlgDirSelectComboBoxExW( this->m_hWnd, (LPTSTR)str, 1024, IDC_COMBO1); AfxMessageBox(str); }

みんなの回答

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.5

>XPビジュアルスタイルを設定すると DlgDirSelectComboBoxExを呼び出した後 スタックが壊れるようです 逆アセンブルリストは…見ても判りませんでした。 # っていうか68000のアセンブラしか勉強したことない。 現象的には…OS側のバグですよねぇ。 XPどころか7でも修正されていない不具合って一体……。 # 誰もレポート上げていない…とか??

super_champ
質問者

お礼

DlgDirSelectComboBoxEx自体あまり使われていないのかもしれませんね。 今回はこのAPIを使わず、自前で関数を作成します。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

XPビジュアルスタイルを設定すると DlgDirSelectComboBoxExを呼び出した後 スタックが壊れるようです インラインアセンブラで PUSH 0などを書き加えてやると 一般保護違反は起きなくなるのですが 今度は DlgDirSelectComboBoxExが失敗して WNDが無効とか Control IDが見つからないなどのエラーになってしまいました AnsNo3の Wr5氏の回答を参考に 自前の関数を作成してみるとか …

super_champ
質問者

お礼

そうですね。 Wr5さんの回答を参考にして自前の関数を作成することにしました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

追加で実験してみました。 No.2はWindows7 Professional SP1 64Bitでエアロスタイル有効でしたが、 今度はWindowsXP Professional SP3で。 ・クラシックスタイル+ビジュアルスタイル使用のマニュフェストなし  正常に取得できました。(表示はクラシックスタイル) ・クラシックスタイル+ビジュアルスタイル使用のマニュフェストあり  一般保護違反で落ちました。(表示はクラシックスタイル) ・ビジュアルスタイル+ビジュアルスタイル使用のマニュフェストなし  一般保護違反で落ちました。(表示はビジュアルスタイル有効) ・ビジュアルスタイル+ビジュアルスタイル使用のマニュフェストあり  一般保護違反で落ちました。(表示はビジュアルスタイル有効) なんというか……どうにもならないって感じですな。 ディレクトリ(フォルダ)選択にはSHBrowseForFolder()とかを使用する。 というのが一般的になりつつありますので、DlgDirSelectComboBoxEx()を使用している人自体が少ないのかも知れません。 # 新たなダイアログを開く必要がない。とかそういう利点はありますけど……。 DlgDirListComboBox()が掲示のオプションの場合、最初に設定したドライブ以外のディレクトリは選択できませんし。 取得した文字列もディレクトリ名だけでドライブ名や上位のディレクトリ名も取得出来ませんから……。 取得した結果が':'で終わっていればドライブを選択された。 ということで、フィルタ文字列を変更してDlgDirListComboBox()で再設定を行えば、該当ドライブのディレクトリ一覧に更新できますが……。 選択されたのがディレクトリの場合は、別に保存しておいた上位のディレクトリ名と結合していけばパス名は構築できるでしょう。 # SHBrowseForFolder()とかの方がお手軽ですけどね。 # GetOpenFileName()をディレクトリ名取得に使う。という変則技もありでしょう。 DlgDirSelectComboBoxEx()を使用せずに、そのままコンボボックスの文字列を取得して自前で処理する。 というのも、アリと言えばアリですかね。 ディレクトリ名に'['や']'を使われていると面倒ですが。 # C:\-x- なんてディレクトリがあった場合も。 取得した文字列のディレクトリが存在するか確認して、無ければ前後の'['と']'をカット。 その後の文字列でさらにディレクトリが存在するか確認して、先頭と最後の文字が'-'だったらドライブ名が選択された。として先頭と最後の文字が'-'を削除して':'を最後に追加。 ディレクトリが存在した場合は最後に'\'を追加。 サブディレクトリの一覧を出す場合はさらに手間…ですかね。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

対処方法は不明ですが… ビジュアルスタイルにしているとDlgDirSelectComboBoxEx()API内で死ぬようです。 DLL側の問題なんでしょうかねぇ? # ググってもちょっと見つけられませんでした。 ところで…… >DlgDirListComboBox( work.GetBuffer(), IDC_COMBO1, 0, DDL_DIRECTORY | DDL_DRIVES | DDL_EXCLUSIVE); はCWnd::DlgDirListComboBox()で、 >DlgDirSelectComboBoxExW( this->m_hWnd, (LPTSTR)str, 1024, IDC_COMBO1); はWin32APIを使用。 というのはちぐはぐですね。 CWnd::DlgDirSelectComboBox()を使用するべきではありませんかね? # まぁ、いずれにしろちゃんと実行できないのですが…。

super_champ
質問者

お礼

>CWnd::DlgDirSelectComboBox()を使用するべきではありませんかね? そうですね。 ご指摘ありがとうございました。 対処方法については、もう少し調べてみます。

全文を見る
すると、全ての回答が全文表示されます。
noname#251971
noname#251971
回答No.1

実際試したわけでなく、問題点の確信があるわけでもありませんが、 コードを見てここを変えてみてはどうかと思う点について回答いたします。 DlgDirListComboBox() のほうは、CWndクラスのメンバ関数を利用しており、 DlgDirSelectComboBoxExW()のほうは、Windows APIを直接利用されているようですが、 取得のほうも CWnd クラスのメンバ関数である DlgDirSelectComboBox() を 利用してみてはどうでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 猫でも 20章

    LRESULTはlong型、DWORDはmsdnより、「32 ビットの符号なし整数、またはセグメント アドレスとそれに関連するオフセット」、SendMessageは返り値はLRESULT型。それで、猫でもわかるプログラミング20章(http://www.kumei.ne.jp/c_lang/sdk/sdk_20.htm)、の上のほうにリスト等の情報を取得するのに、 int getDlg(HWND hDlgWnd) { GetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT1), edit_str, sizeof(edit_str)); ScrPos = GetScrollPos(GetDlgItem(hDlgWnd, IDC_SCROLL1), SB_CTL); ListNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_LIST1), LB_GETCURSEL, 0L, 0L); ComboNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_COMBO1), CB_GETCURSEL, 0L, 0L); return 0; } とあるのですが、SendMessageを(int)(DWORD)とキャストしているのはなぜなんでしょうか。(int)ではダメですか?

  • テキストファイルの各行の文字列を、コンボBoxに表示させたい

    テキストファイルの各行の文字列を、コンボBoxに表示させたい 現在VC++ MFCの勉強をしております。(MFCに拘ってはおりません) 下のテキストファイル"D:\data.txt" (Shift_JIS)から (内容) 田中さん 斉藤さん 吉田さん CFile の Read で一行ずつ読み込んで、CStringArrayを使って コンボBox に Insert したいと思っています。 下記のコードについてですが。 BOOL CAddDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ここに初期化を追加してください TCHAR* pszFileName = L"d:\\data.txt"; CFileException fileException; CFile cFile; int ret; char buffLine[256] ; CStringArray cStrComboArr ; // リスト ret = cFile.Open( pszFileName , CFile::modeRead | CFile::shareDenyNone , &fileException ); if ( ret == false ) { AfxMessageBox( L"ファイルが読込めません。" ); return 1; } while ( (ret = cFile.Read( &buffLine , 256 )) != 0 ) { cStrComboArr.Add( buffLine ); /* ここでビルドエラー */ } cFile.Close(); // コンボboxに入れる CComboBoxEx* pCombo = (CComboBoxEx*) GetDlgItem( IDC_COMBOBOXEX1 ); COMBOBOXEXITEM cbi ; cbi.mask = CBEIF_TEXT; for ( int i = 0; i < cStrComboArr.GetCount(); i++ ) { cbi.iItem = i; cbi.pszText = (LPTSTR)(LPCTSTR) cStrComboArr.ElementAt(i) ; // 「'CString' から 'LPWSTR' に変換できません」から。 cbi.cchTextMax = 256; pCombo->InsertItem( &cbi ); } return TRUE; // return TRUE unless you set the focus to a control // 例外 : OCX プロパティ ページは必ず FALSE を返します。 } cStrComboArr.Add( buffLine ); の部分でエラー表示は、 「INT_PTR CStringArray::Add(LPCTSTR)' : 1 番目の引数を 'char [256]' から 'LPCTSTR' に変換できません。」です。 根本的にやり方が間違っているのか、もう少しのところなのか、 ズバッとご指摘いただけないでしょうか。 宜しくお願いします。 OS : Vista Home Premium VS 2008 pro

  • VC++ 2010 メッセージが文字化けします。

    現在、VC++でアプリケーションを作っています。 超初心者なのでわからない事だらけです。 どなたかご教授お願いします。 <質問内容> sendmessageで送信した文字列をtextboxに表示したら文字化けします。 原因がわからないので、もし何か気づかれた方がおられましたら教えてください。 特にどのように変更すれば良いかご指摘いただけると本当に助かります。 <開発環境> Windows XPモード Visual Studio 2010 professional Visual C++ windows フォームアプリケーション <アプリ動作> 2つのアプリケーションを使用し、片方のアプリから文字列を送り、もう片方のアプリで受信します。 また、受け取った側のアプリケーションは受け取った文字列をtextboxに表示します。 送信側はsendmessage関数で文字列を送信し、受信側はwndproc関数と、共有メモリを使用して受信と表示を行っています。 下記がソースです。 ~送信側ソース~ #pragma once #include<windows.h> #include<iostream> #include<fstream> #include<string> #pragma comment(lib,"user32.lib") using namespace std; using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; [DllImport("user32.dll") ] extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName); [DllImport("user32.dll")] extern System::String^ SendMessage(HWND hWnd, int Msg, int wParam, int lParam); public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {              COPYDATASTRUCT cd; HWND hWnd; char buffer[500]; strcpy_s(buffer,"失敗しました。");       cd.dwData=0; cd.cbData=strlen(buffer)+1; cd.lpData=buffer; hWnd=::FindWindow(nullptr,L"ソフト"); ::SendMessage((HWND)hWnd,WM_COPYDATA,0,(LPARAM)&cd); } ~受信側ソース~ #pragma once #pragma comment(lib,"user32.lib") #include<ctype.h> #include<windows.h> #include<msclr/marshal.h> using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; public: virtual void WndProc(System::Windows::Forms::Message% msg) override { if(msg.Msg== WM_COPYDATA) { COPYDATASTRUCT *cd; cd=(COPYDATASTRUCT *)msg.LParam.ToInt32(); System::String^ str; str=gcnew System::String((wchar_t*)cd->lpData); pin_ptr<const wchar_t>pstr=PtrToStringChars(str); System::String^ ShareMemoryName1=L"LotInformation"; HANDLE hmap; LPVOID pmap; marshal_context^ context= gcnew marshal_context; LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1); hmap=OpenFileMapping(FILE_MAP_WRITE,FALSE,ShareMemoryName2); if(hmap==NULL) { hmap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,(DWORD)0,(DWORD)2048,(LPCTSTR)ShareMemoryName2); if(hmap!=NULL) { pmap=MapViewOfFile(hmap,FILE_MAP_WRITE,0,0,0); hmap=OpenFileMapping(FILE_MAP_WRITE,FALSE,ShareMemoryName2); if(pmap!=NULL) { ZeroMemory(pmap,2048); } } } else { pmap=MapViewOfFileEx(hmap,FILE_MAP_WRITE,0,0,0,NULL); } ZeroMemory(pmap,2048); memcpy_s(pmap,2048,pstr,sizeof(pstr)); System::String^ str1; str1= gcnew System::String((const wchar_t *)pmap); textBox5->Text=str1; UnmapViewOfFile(pmap); CloseHandle(hmap); } Form::WndProc(msg); }

  • [C++]WCHARの1文字目しか表示できない

    あるWebサイトによると以下のプログラムでディレクトリ内の ファイル一覧を表示できるそうだ。たしかにファイル一覧を 表示できた。しかし、わたしの電子計算機上では、 ファイル名の1文字目しか表示できない。 なおfd.cFileNameはWCHARという配列のようだ。fd.cFileName[2]のように 文字位置を指定すれば、1文字目以降を取得できる。 Windows XP SP3 Visual C++ 2008 Express Edition ーーーーーーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string> #include <iostream> #include "windows.h" using namespace std; int main(int argc, char *argv[]) { HANDLE hFind; WIN32_FIND_DATA fd; FILETIME ft; SYSTEMTIME st; wstring FName; FName = L"*.*"; /* 最初のファイル検索 */ hFind = FindFirstFile(FName.c_str(), &fd); /* 検索失敗? */ if(hFind == INVALID_HANDLE_VALUE) { printf("検索失敗\n"); return(0); /******** エラー終了 ********/ } while(FindNextFile(hFind, &fd)){ FileTimeToLocalFileTime(&fd.ftLastWriteTime, &ft); FileTimeToSystemTime(&ft, &st); printf("ファイル名: %s", fd.cFileName); if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("(ディレクトリ)"); } printf("\n短いファイル名: %s\n", fd.cAlternateFileName); printf("ファイルサイズ: %d\n", fd.nFileSizeLow); printf("更新日: %04d/%02d/%02d %02d:%02d:%02d\n\n",st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); } /* 検索終了 */ FindClose(hFind); return(0); }

  • フォルダ検索

    初めまして宜しくお願い致します。 当方、C言語しか経験がなく、Javaは全くの初心ですが Javaで以下のことを行いたく、プログラムを組んだのですが うまく動作しません。 <処理内容> 特定のフォルダ配下を検索して、フォルダ名(List型)とファイル名(String)を返却する。 SerchFolder |-------- FolderAAA | |----- FolderBBB | |-----FileCCC | |-------- FolderXXX | |----- FolderYYY | |-----FileZZZ <検索対象フォルダ:SerchFolder> 検索結果格納クラス(ContentsConst クラス配列型) メンバ変数 ArrayList型 key; メンバ変数 String型 num; 上記フォルダの検索結果は以下の通りになるようにしたい。 ContentsConst[0] keyに、{FolderAAA, FolderBBB} numに、"FileCCC" ContentsConst[1] keyに、{FolderXXX, FolderYYY} numに、"FileZZZ" <コード例> // 検索結果格納クラス public class ContentsConst { public ArrayList key; public String num; } public class ContentsManagement { // フォルダ検索メソッド public ContentsConst[] read(String filepath){ // 検索結果格納配列型クラス ContentsConst[] ContentsKey = new ContentsConst[10001]; File idir = new File(filepath); // 検索対象ディレクトリ(SerchFolder)以下の一覧を取得 File[] filelist = idir.listFiles(); // 検索対象ディレクトリ(SerchFolder)以下分ループする for (int i = 0 ; i < filelist.length ; i++){ // フォルダ名一時格納用 ArrayList ContentsWork = new ArrayList(); // 処理省略 //検索し、Dirならば Dir名(FolderAAA) 格納 ContentsWork.add(filelist[i].getName()); // 処理省略 //検索し、Dirならば Dir名(FolderBBB) 格納 ContentsWork.add(filelist2[i].getName()); // 処理省略 //検索し、fileならば file名(FileCCC) 格納 if (filelist3[k].isFile()){ // Dir を順番に格納するためのループ for(int l =0; l<ContentsWork.size(); l++){ // "注意" 一時格納用のList⇒ // 配列型クラスに値をコピーしようとするが、 // エラーとなり、コピーできない // "ecllips のエラー "ソースが見つかりませんでした。"" ContentsKey[i].key.add(ContentsWork); } // "注意" 一時ワークとして、String型の変数に格納して、 // コピーしようとするものの上記同様のエラーが出力される String str = filelist3[k].getName(); ContentsKey[i].num = str ; }else if (filelist3[k].isDirectory()){ // ディレクトリだった時は対象外 break; } かなりCライクなプログラミングで、Javaっぽくないのは重々承知しております。 そのへんについても、ご意見が頂ければ、幸いです。

  • VC++メッセージの送受信について教えてください。

    VC++でソフトを作成しています。 初心者なのでわからないことだらけです。 どなたかご教授お願いします。 ■環境 Windows xp mode Visual Studio 2010 Professional VC++ フォームアプリケーション .net Framework4.0 ■相談内容 アプリ1のtextBoxに入力された文字列をアプリ2に送信して、アプリ2のtextBoxに表示させたいのですが、PostMessageを使用するとメッセージが送れません。 また、SendMessageを使用すると送れますが、共有メモリを使用すると文字列が途中で途切れてしまいます。 PostMessageと共有メモリの使用は指令なのではずせません。 理由は送信側のアプリがロックされるのを防ぐため、後に多数のアプリから送信した文字列を取得できるようにするためです。 下記にソースコードを記載しますので、どこが悪いのか、何が原因でそうなるのか、どうすれば正常に動作するようにできるのかを教えてください。 特に、ソースについてはどこをどのように直せば良いかを教えていただけるとありがたいです。 ~送信側ソース~ #pragma once #include<windows.h> #include<iostream> #include<fstream> #include<string> #include<msclr/marshal.h> #pragma comment(lib,"user32.lib") int s; using namespace std; using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; [DllImport("user32.dll") ] extern System::String^ FindWindow(String^ lpClassName, String^ lpWindowName); [DllImport("user32.dll")] extern System::String^ PostMessage(HWND hWnd, int Msg, int wParam, int lParam); public: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { System::String^ moji_textBox4; moji_textBox4=textBox4->Text; s=textBox4->Text->Length+1; COPYDATASTRUCT cd; HWND hWnd; char buffer[500]; sprintf_s(&buffer[0],5,"%s",moji_textBox4); cd.dwData=0; cd.cbData=s;//strlen(buffer)+1; cd.lpData=buffer; hWnd=::FindWindow(nullptr,L"アプリ2"); ::PostMessage((HWND)hWnd,WM_COPYDATA,0,(LPARAM)&cd); ~受信側ソース~ #pragma once #pragma comment(lib,"user32.lib") #include<ctype.h> #include<windows.h> #include<msclr/marshal.h> using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Runtime::InteropServices; using namespace msclr::interop; public: virtual void WndProc(System::Windows::Forms::Message% msg) override { if(msg.Msg== WM_COPYDATA) { COPYDATASTRUCT *cd; cd=(COPYDATASTRUCT *)msg.LParam.ToInt32(); System::String^ str; str=gcnew System::String((char *)cd->lpData); pin_ptr<const wchar_t>pstr=PtrToStringChars(str); System::String^ ShareMemoryName1=L"Information"; HANDLE hmap; char *pmap; marshal_context^ context= gcnew marshal_context; LPCTSTR ShareMemoryName2 = context->marshal_as<LPCTSTR>(ShareMemoryName1); hmap=::CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,2048, (LPCTSTR)ShareMemoryName2); pmap=(char *)::MapViewOfFile(hmap,FILE_MAP_ALL_ACCESS,0,0,1024); System::String^ pstr1= gcnew System::String(pstr); ZeroMemory(pmap,2048); memcpy_s(pmap,2048,pstr,sizeof(pstr)); System::String^ str1; str1= gcnew System::String((char *)pmap); textBox6->Text=str1; UnmapViewOfFile(pmap); CloseHandle(hmap); } Form::WndProc(msg); }

  • Unicode でのWin32アプリのプロセスが終了しません

    Visual Studio 2008 のVC++ でのアプリ開発について困っています。 開発環境はOS:Vista Ultimate 64bitです。 開発しようとしているのはWin32プロジェクトです。 先ず以下がソースです。 --- /** @brief メインファイル */ // Option declarations #define STRICT #define WIN32_LEAN_AND_MEAN // Includes #include<stdio.h> #include<stdlib.h> #include<string.h> #include<tchar.h> #include<process.h> #include<windows.h> #include<windowsx.h> #include<winerror.h> // Constance declarations #define WND_CX (1024) #define WND_CY (768) #define ERR_QUIT (-1) // Structures declarations typedef struct _winapp { HINSTANCE hInst; HWND hWnd; TCHAR sTitle[128]; TCHAR sWndClass[128]; }WINAPP, *PWINAPP; // Prototype declarations LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); HRESULT Init(WINAPP& app); long Uninit(WINAPP& app); WPARAM MsgLoop(WINAPP& app); long Idle(void); // Global variables WINAPP g_app; /** @brief Entry point */ int WINAPI ::_tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR pCmdLine, int shwcmd) { // Win32App initialize ::memset(&g_app, 0, sizeof(g_app)); g_app.hInst = hInst; ::_tcscpy_s(g_app.sTitle, sizeof(g_app.sTitle), _T("myapp")); ::_tcscpy_s(g_app.sWndClass, sizeof(g_app.sWndClass), _T("myapp")); HRESULT hr = ::Init(g_app); if(FAILED(hr)) return ERR_QUIT; // Message loop WPARAM wp = ::MsgLoop(g_app); // WinApp32 uninitialize ::Uninit(g_app); return (int)wp; } /** @brief Main window procedure */ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch(msg){ case WM_DESTROY: ::PostQuitMessage(0); g_app.hWnd = NULL; break; default: return ::DefWindowProc(hWnd, msg, wp, lp); } return 0; } /** @brief Initialize win32 application */ HRESULT Init(WINAPP& app) { // Register window class WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)::WndProc; wc.cbClsExtra = wc.cbWndExtra = 0; wc.hInstance = app.hInst; wc.hIcon = NULL; wc.hIconSm = NULL; wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = app.sWndClass; if(::RegisterClassEx(&wc)==0) return ::GetLastError(); // Create main window RECT rc = { 0, 0, WND_CX, WND_CY}; ::AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); g_app.hWnd = ::CreateWindow( app.sWndClass, app.sTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, app.hInst, NULL); if(app.hWnd==NULL) return ::GetLastError(); // Show window ::ShowWindow(app.hWnd, SW_SHOWNORMAL); ::UpdateWindow(app.hWnd); return S_OK; } /** @brief Uninitalize win32 application */ long Uninit(WINAPP& app) { return ::UnregisterClass(app.sWndClass, app.hInst); } /** @brief Message loop */ WPARAM MsgLoop(WINAPP& app) { MSG msg = {}; while(msg.message!=WM_QUIT){ if(::PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){ ::TranslateMessage(&msg); ::DispatchMessage(&msg); }else{ // Idle process if(Idle()==0) ::DestroyWindow(app.hWnd); // Occur error and exit application. } } return msg.wParam; } /** @brief Idle process */ long Idle(void) { return 1; } --- 以上がソースなのですがプロジェクトのプロパティの文字セットが Unicodeだとプロセスが終了しません。 文字セットをマルチバイトに変更するとプロセスは終了します。 なお、メイン関数を終了はしている様子。 どなたか理由がお分かりになる方はおられませんでしょうか? お手数ですがご回答いただければ幸いです。