GetOpenFileNameにてエラーをなくすためには?


ネオ  2006-06-08 22:12:28  No: 62105

はじめまして。質問させて頂きます。
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);

以上、宜しくお願い致します。


dairygoods  2006-06-08 22:16:15  No: 62106

char ext[3]={0};

拡張子のバッファが3バイト(=2文字分)しかないのが気になります。


Blue  2006-06-08 22:22:05  No: 62107

もしかして、これ?
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 したほうが無難かも。


ネオ  2006-06-09 00:54:46  No: 62108

ご回答ありがとうございます。
リンクのURLを見ていますと、

①環境にAdobe Reader 7.0があり、私のPCに該当している。
②しかし、アプリでGetOpenFileNameをコールする前に
CoInitialize(NULL);
でCOM初期処理をしておくとクラッシュしない
③さらに、ウィンドウを閉じる(スレッドとして終了する)
前にCoUninitializeをよんでおいたほうが良い

とありました。

拡張子のバッファを*2にすることと、
上記の②&③の対策も施そうと思いますが、

②のCoInitialize(NULL);に関してCOMオブジェクトとは
具体的にどのようなものなのでしょうか?

宜しくお願い致します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加