「ファイルを開くプログラムの選択」のダイアログ

[戻る]
アップル紅茶 2002/09/16(月) 22:59:14
よろしくお願いします。(開発=VC++6.0,Win2000,SDK使用)

「ファイルを開くプログラムの選択」のダイアログを起動するAPI関数ってあるの?
調べてみたけどわからなかったです。あれば教えてくださーい。

とも 2002/09/19(木) 00:21:19
ShellExecute(NULL,NULL,"rundll32.exe","shell32.dll,OpenAs_RunDLL 名前",  
NULL,TRUE);
でOKでは

例)
ShellExecute(NULL,NULL,"rundll32.exe","shell32.dll,OpenAs_RunDLL 
C:\\****\\pppp\\yyyy.txt",  NULL,TRUE);
で起動できます

因みに
char Path[120]="C:\\****\\pppp\\yyyy.txt";
ShellExecute(NULL,NULL,"rundll32.exe","shell32.dll,OpenAs_RunDLL Path",  
NULL,TRUE);
では起動できませんね
なぜなのかはわかりません

アップル紅茶 2002/09/19(木) 10:53:44
>因みに
>char Path[120]="C:\\****\\pppp\\yyyy.txt";
>ShellExecute(NULL,NULL,"rundll32.exe","shell32.dll,OpenAs_RunDLL Path",  
>NULL,TRUE);
>では起動できませんね
>なぜなのかはわかりません

ありがとうございます。

↑この部分と関係あるのですが、たとえば取得してきたフルパスを引数にするにはどう
すればいいのでしょうか。どなたかご教授お願いできないでしょうか。よろしくおねが
いします。

chiloli 2002/09/19(木) 15:24:56
ともさんがここまでヒントを下さっているのだから、少しはご自分で調べるぐらい
なさったらどうですか。
引数の代入の仕方を変えれば出来ると思うんですが。
まずはご自分で試してみてください。

陰陽 2002/09/21(土) 11:47:38
>因みに
>char Path[120]="C:\\****\\pppp\\yyyy.txt";
>ShellExecute(NULL,NULL,"rundll32.exe","shell32.dll,OpenAs_RunDLL Path",  
>NULL,TRUE);
>では起動できませんね
>なぜなのかはわかりません

これ、当然でしょう。
だって、
"shell32.dll,OpenAs_RunDLL Path"と
"shell32.dll,OpenAs_RunDLL C:\\****\\pppp\\yyyy.txt"は全く別ですから。

このPathって文字列使いたいならこんな感じ?
char Path[120]="C:\\****\\pppp\\yyyy.txt";
char exePath[120]="shell32.dll,OpenAs_RunDLL "
strcat(exePath, Path);
ShellExecute(NULL,NULL,"rundll32.exe",exePath,NULL,TRUE);

アップル紅茶 2002/09/21(土) 13:01:41
すいません。

>char Path[120]="C:\\****\\pppp\\yyyy.txt";
>char exePath[120]="shell32.dll,OpenAs_RunDLL "
>strcat(exePath, Path);
>ShellExecute(NULL,NULL,"rundll32.exe",exePath,NULL,TRUE);

でやってもダメでした。また、

StrNCat(exePath, Path, 24+1);を使ってみてもダメでした。

ちょっとよくわからないです....

さとみ 2002/09/21(土) 17:56:14
よろしくッ!

私はC言語の勉強をはじめた初心者なのですが、ここで問題となっている文字列(パス)
の代入の仕方とか非常に興味がありますね。
個人的には、strcat()ではうまくいかないような気が・・。第1引数の指定はヌルを含
めたパスなはずなので・・。間違っていたらごめんなさい。
解決できるといいですね。

YuO [E-Mail] 2002/09/22(日) 07:53:10
せっかくプログラム書いているのにrundll32.exeを起動するのもどうかな……
というわけで,調べてみました。

void OpenAs_RunDLL (HWND hParent, const char * szPath)
{
    static void (CALLBACK * OpenAs)(HWND, HINSTANCE, LPCSTR, int);

    if (OpenAs == NULL) {
        HINSTANCE hShell32 = LoadLibrary("shell32.dll");
        OpenAs - (void (CALLBACK *)(HWND, HINSTANCE, LPCSTR, int))GetProcAddress(hShell32, "OpenAs_RunDLL");
        if (OpenAs == NULL) return;
    }

    OpenAs(hParent, NULL, szPath, SW_SHOWNORMAL);
}

でいけるみたいです。
Windows 2000やWindows XPで使うときは,
OpenAs_RunDLLのエントリポイントとOpenAs_RunDLLAのエントリポイントが等しいことをチェックしてください。
#NT 4.0では一緒でした。
違うのであれば,OS切り分けてNT系はOpenAs_RunDLLAを引きだしてください。

あと,shell32.dllを相手にしているので手抜きしています。
引数の意味は……調べられなかったので適当です。

アップル紅茶 2002/09/23(月) 01:17:48
無事解決しました!! YuO さんッ!ありがとうございます。m(__)m
お手数おかけして恐縮です。。。

みなさんもありがとうございました。

ただ、1つ疑問点が....

YuO さんに提示していただいたサンプルを参考にして自分なりに調べてみたのですが、
呼び出したDLLを"FreeLibrary(hShell32)"で開放する必要はないのでしょうか?
DLLを動的にロードした場合には、そのDLLを開放しなければならないみたいなのです
が?一応、作成中のプログラムには追加しました...
ご教授いただけたら幸いです。

YuO [E-Mail] 2002/09/23(月) 08:41:09
> 呼び出したDLLを"FreeLibrary(hShell32)"で開放する必要はないのでしょうか?

だからぁ……。
>あと,shell32.dllを相手にしているので手抜きしています。
です。

基本的に,Shell32.dllは標準で読み込まれているDLLなので,
FreeLibraryの役割は単に参照カウントを減らしているだけです。
結局,解放されるのはプロセスが終了したときなので,放っています。
#それによってDllMainにDLL_PROCESS_DETACHが来ない,なんてこともない。

アップル紅茶 2002/09/23(月) 22:19:01
[[解決]]
YuOさん、どうもありがとうございました。納得しました。解決チェック入れておきま
す。

古いスレッドには追加発言できません。