プログラムアイコンにファイルをドラッグ&ドロップ

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
あおぞら

プログラムアイコンにファイルをドラッグ&ドロップ

#1 投稿記事 by あおぞら »

いつもお世話になっております。

たとえばmp3プレーヤーで、
プログラムアイコンやショートカットアイコンに、ファイルをドラッグ&ドロップして、起動した時に、ドロップしたファイルのパスを入手するには、どうすればいいんでしょう。

特別なハンドルでもあるのかと、オフィシャルユーザーズガイドや、ウェブ検索で彷徨いましたが、見つけられずにおりますm(__)m
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: プログラムアイコンにファイルをドラッグ&ドロップ

#2 投稿記事 by イグトランス »

プログラムアイコンやショートカットアイコンへのドラッグアンドドロップはコマンドライン引数として渡されます。
つまりGetCommandLine()で取得できますが、これには頭に自分自身のパスが含まれているのでこれを除去する必要があります。

しかしこれはSHLWAPI.DLLにPathGetArgv()というのがあるので、
結局PathGetArgv(GetCommandLine())とすればいいわけです。

ちなみに関連付け起動もコマンドライン引数で渡されるので、これをやれば関連付けにも対応することになります。
あおぞら

Re: プログラムアイコンにファイルをドラッグ&ドロップ

#3 投稿記事 by あおぞら »

> プログラムアイコンやショートカットアイコンへのドラッグアンドドロップはコマンドライン引数として渡されます。

なんとargvとは(^_^; DOSのCと格闘していた頃を思い出しました。ありがとうございました。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

Re: プログラムアイコンにファイルをドラッグ&ドロップ

#4 投稿記事 by Sinryow »

> プログラムアイコンやショートカットアイコンへのドラッグアンドドロップはコマンドライン引数として渡されます。
> つまりGetCommandLine()で取得できますが、これには頭に自分自身のパスが含まれているのでこれを除去する必要があります。

かなりの隠しワザですね。
MSDNでもヒットしないですし,Googleですらもヒットしない関数ですし(爆)
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

Re: プログラムアイコンにファイルをドラッグ&ドロップ

#5 投稿記事 by tak »

> しかしこれはSHLWAPI.DLLにPathGetArgv()というのがあるので、
> 結局PathGetArgv(GetCommandLine())とすればいいわけです。

とりあえずAscii関数だろうという推測の元、次のように宣言してみました。

Declare Sub PathGetArgv Lib "shlwapi.dll" Alias "PathGetArgvA" (ByVal p As BytePtr)

しかし、これではうまくインポートできませんでした。
そこで少し調べたところ、僕の環境では、SHLWAPI.DLLにPathGetArgv、またはこれに類似のエクスポートは存在しませんでした。
DLLを16進ダンプして検索したところ、PathGetArgvはかすりもしませんでした。

SHLWAPI.DLLのバージョン情報は、次の通りです。
ファイルバージョン:6.00.2900.2668 (xpsp_sp2_gdr.050430-1553)
製品バージョン:6.00.2900.2668
製品名:Microsoft(R) Windows(R) Operating System

なんと、OSの一部だったんですね。こんなDLL知りませんでした (^^;
それはいいとして、資料が少なすぎ(というか、皆無)なのでどういう事かさっぱりわかりません。
あれば便利な関数だけに、惜しいものです。
ノッチ
記事: 82
登録日時: 2005年6月01日(水) 23:27
お住まい: 北海道札幌市

Re: プログラムアイコンにファイルをドラッグ&ドロップ

#6 投稿記事 by ノッチ »

ノッチです。

> DLLを16進ダンプして検索したところ、PathGetArgvはかすりもしませんでした。

僕の環境でダンプすると"PathGetArgv"はありませんでしたが、
"PathGetArgsA"という関数が見つかりました。
Googleで検索しても出てきますので間違いないと思います。
(ヒット数は少ないですが)

関数の宣言は、

コード: 全て選択

Declare Function PathGetArgs Lib "shlwapi" Alias "PathGetArgsA" (ByVal p As BytePtr) As Long
と、こんな感じでしょうか?
戻り値は、正常時は引数部分のアドレス。
それ以外はNull文字のアドレスらしいです。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

Re: プログラムアイコンにファイルをドラッグ&ドロップ

#7 投稿記事 by tak »

> > DLLを16進ダンプして検索したところ、PathGetArgvはかすりもしませんでした。
>
> 僕の環境でダンプすると"PathGetArgv"はありませんでしたが、
> "PathGetArgsA"という関数が見つかりました。

まさか、Argの複数形とは・・・orz


> 関数の宣言は、
>

コード: 全て選択

Declare Function PathGetArgs Lib "shlwapi" Alias "PathGetArgsA" (ByVal p As BytePtr) As Long
> と、こんな感じでしょうか?
> 戻り値は、正常時は引数部分のアドレス。
> それ以外はNull文字のアドレスらしいです。

じゃあ、正確には

コード: 全て選択

Declare Function PathGetArgs Lib "shlwapi.dll" Alias "PathGetArgsA" (ByVal pszPath As BytePtr) As BytePtr
と、こうなるわけですね。(戻り値の型が変わっただけ)
失敗時の戻り値が特徴的ですね。引数がない場合は終端のNull文字へのポインタが返り、関数が失敗すればNULLが返るそうです。なんともややこしい。

それから、MSDNライブラリ(日本)には掲載されていませんでしたが、MSDN Library(英語)のほうにはちゃんとありました。
(旧)C++のサンプル付きです。(coutとか使われているあたりがC++。ヘッダのインクルードに拡張子 .h が付いているあたりが旧式。)
ご参考まで↓
http://msdn.microsoft.com/library/defau ... etargs.asp
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#8 投稿記事 by イグトランス »

曖昧な記憶でPathGetArgvと書いてしまってお騒がせしてしまいました。どうも済みません。

さてSHLWAPI.DLLはとっても便利なんですけど、Win95/NT4には初めから入っていないのが玉に瑕です。(自分で振っておきながらですが)
最低でもIE4、関数によってはIE5を要求してきます。(しかも再配布不可)
PathGetArgsはSHLWAPI.DLLのバージョン4.71(IE4)以上に搭載されています。

あまり問題にはならないでしょうけど一応念のため。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#9 投稿記事 by tak »

>> イグトランス様

ついでなのですが、他にも WaitForSingleObject を WaitForSingleHandle と記述されたことがありました。
いつか忘れたのですが、そのとき気づいたにもかかわらず指摘しませんでした。すみません。
はて、いつだったかな・・・たぶん新掲示板に移行した後だと思いますが、それでも結構な量ですので、探していません。物臭ですから。


[追記] 6月25日 01:36
実は、このページには検索ボックスがあったのですね。気づきませんでした。
それで検索してみたところ、簡単に見つかりました。便利~♪
http://www.discoversoft.net/forum/viewt ... ngleHandle
返信する