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

「ファイルを開くプログラムの選択」のダ...
 
通知
すべてクリア

[解決済] 「ファイルを開くプログラムの選択」のダイアログ


アップル紅茶
 アップル紅茶
(@アップル紅茶)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

よろしくお願いします。(開発=VC++6.0,Win2000,SDK使用)

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


引用未解決
トピックタグ
とも
 とも
(@とも)
ゲスト
結合: 24年前
投稿: 65
 

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);
では起動できませんね
なぜなのかはわかりません


返信引用
アップル紅茶
 アップル紅茶
(@アップル紅茶)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

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

ありがとうございます。

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


返信引用
chiloli
 chiloli
(@chiloli)
ゲスト
結合: 23年前
投稿: 2
 

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


返信引用
陰陽
 陰陽
(@陰陽)
ゲスト
結合: 23年前
投稿: 1
 

>因みに
>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);


返信引用
アップル紅茶
 アップル紅茶
(@アップル紅茶)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

すいません。

>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);を使ってみてもダメでした。

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


返信引用
さとみ
 さとみ
(@さとみ)
ゲスト
結合: 23年前
投稿: 1
 

よろしくッ!

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

せっかくプログラム書いているのに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を相手にしているので手抜きしています。
引数の意味は……調べられなかったので適当です。


返信引用
アップル紅茶
 アップル紅茶
(@アップル紅茶)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

無事解決しました!! YuO さんッ!ありがとうございます。m(__)m
お手数おかけして恐縮です。。。

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

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> 呼び出したDLLをFreeLibrary(hShell32)で開放する必要はないのでしょうか?

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

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


返信引用
アップル紅茶
 アップル紅茶
(@アップル紅茶)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

YuOさん、どうもありがとうございました。納得しました。解決チェック入れておきま
す。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました