はじめまして。質問させて頂きます。
Win32APIにてアプリを作成したのですが、ディレクトリを指定してから
ファイル読み込む機能時に、そのアプリ自身が急に落ちてしまう現象が
起きています。下記にその関数を記載しますが、どこに原因があるのか
教えて頂けないでしょうか?
【関数内部】
char file_name[260]={0};
char path_buffer[260]={0};
char drive[3]={0};
char dir[256]={0};
char fname[256]={0};
char ext[3]={0};
OPENFILENAME SFN;
memset(&SFN, 0, sizeof(OPENFILENAME));
SFN.lStructSize = sizeof(OPENFILENAME);
SFN.hwndOwner = ghwndApp;
SFN.lpstrFilter = "Set File(*.set)\0*.set\0";
SFN.lpstrFile = file_name;
SFN.nMaxFile = MAX_PATH;
if(!GetOpenFileName(&SFN))
return FALSE;
_splitpath(file_name,drive,dir,fname,ext);
以上、宜しくお願い致します。
char ext[3]={0};
拡張子のバッファが3バイト(=2文字分)しかないのが気になります。
もしかして、これ?
http://www.vcppclub.com/bbs1/wforum.cgi?mode=allread&no=3380&page=0
ちなみに
> OPENFILENAME SFN;
> memset(&SFN, 0, sizeof(OPENFILENAME));
も宣言時に初期化できます。(memset不要)
OPENFILENAME SFN = {0};
> char file_name[260]={0};
> char path_buffer[260]={0};
> char drive[3]={0};
> char dir[256]={0};
> char fname[256]={0};
> char ext[3]={0};
_MAX_PATHや_MAXFNAME等の#defineを使ったほうが良いかも。
# UNICODEシステムである場合、MAX_PATHはUnicodeで指定できる文字数なので、
# char型で使う場合は、*2 したほうが無難かも。
ご回答ありがとうございます。
リンクのURLを見ていますと、
①環境にAdobe Reader 7.0があり、私のPCに該当している。
②しかし、アプリでGetOpenFileNameをコールする前に
CoInitialize(NULL);
でCOM初期処理をしておくとクラッシュしない
③さらに、ウィンドウを閉じる(スレッドとして終了する)
前にCoUninitializeをよんでおいたほうが良い
とありました。
拡張子のバッファを*2にすることと、
上記の②&③の対策も施そうと思いますが、
②のCoInitialize(NULL);に関してCOMオブジェクトとは
具体的にどのようなものなのでしょうか?
宜しくお願い致します。
ツイート | ![]() |