ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月20日(土) 02:27

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年5月24日(水) 14:58 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
hiraさんの投稿(6番目にあります)に関連しています。
 内容がスレッドからそれてきたので、別スレッドを立てます。
 質問と言うよりは、hiraさんへのレス(&厚かましく依頼^^;)の形になります。


目的:
IEからD&DによってURL(ページor画像、その他)を取得したい。

現在の問題点:
RADでいうところのDropFilesイベントでは取得できない。

引用:
IEからのD&D受け入れなら、OLEドラッグ&ドロップができればいいような気がします。プログラムからIEにD&Dでデータを送るにはフォーマットをCF_TEXTにしてURLを詰めればいいでしょう。
ただ現状ではActiveBasicから動かすのが難しく(最近のバージョンならできる?)、C言語でDLLを作ってActiveBasicから呼び出す必要がありそうです。
OLEドラッグ&ドロップ?
ナンデスカソレハ・・・?
普通のD&D(shell32.dllのDragAcceptFiles辺りを使うヤツ)とは
違う種類のD&Dがあるとは知りませんでした。
たしかに、IEコンポーネントなんぞ使わなくても、
OLE経由でD&Dを受け入れられるみたいですね。
(個人的メモ:OLE→今はActiveXと呼ばれている?ものでクリップボードなどをサポート)

でも・・・難易度としては低くなく感じました(汗)。
 OLEインターフェース?
 COMインターフェース?
サンプルファイル、たくさん定義されてる・・・移植メンドソウ( ̄▽ ̄;)
AB4.xであれば直接操作できるようになったみたいですが・・・。
これと同じ流れになるのでしょうか?

参考になりそうなページをとりあえずメモ。
http://www.alles.or.jp/~baron/drag.html
http://smile.poosan.net/perl-bin/hsp/ve ... 010010.txt
他に、hiraさんのページの「OLEドロップをAB単体で実現する」かな。

時間が出来たら、がんばって組んでみようと思います。
オフにちょっと用事が入ってしまったため、しばらく先になりそうですが・・・。


もしよろしければhira様、もしくは詳しい方、ライブラリにまとめてもらえませんでしょうか?(爆)
DragAcceptFiles()+DragQueryFile()+DragFinish()などという感じで
簡単に使えるライブラリにしてもらえれば助かります(^^;)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月24日(水) 18:07 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
>「OLEドロップをAB単体で実現する」
AB4.xのクラスを使えば何とかなるのかもしれませんが、まだ成功していないので何ともいえませんね(^^;;
何とか時間を見つけてやってみますが、できるかどうかはわかりません…。何と言ってもActiveBasicのCOM関係の仕様がはっきりしていませんからね。
※できることなら私もAucMonにDLLなんて添付したくないですしね…

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月24日(水) 19:14 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
現在のABの実装では呼び出し方式の違いでCOMインターフェイスの実装にクラスを使うことはできないと思います。
AB5ではできるようになっていてほしいものです。

今日は試すほどの暇はありませんが,一旦普通の大域的な関数を作り,
その中でクラスのメンバ関数へ転送するということを考えています。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月26日(金) 23:44 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
どうにかOLEドラッグアンドドロップを受け入れるところまでは辿り着きました。
後はデータを取り出すだけです。

本当はプロジェクト全体をアーカイブしてアップロードできれば楽なのですが,
ここに直接書いてしまっています。

ノーマルウィンドウベースで新しくプロジェクトを作ってください。そして,次のファイルを追加します。

Interface.sbp - インターフェイスやその他宣言類です。 OleDragDropImpl.abp - 実際にOLEドラッグアンドドロップを受け取るためのクラスがあります。 Thunk.abp - COMのインターフェイスのメソッドをABのクラスのメソッドへ委譲するコードがあります。
ABのクラスがCOMインターフェイスの実装に使えるようになったらこのファイルは丸ごと不要になる予定です。
単にCOMやOLEを使いたいだけならあまりじろじろ覗かないことをお勧めします。 MainWndのCreate/Destroyイベントを次のようにしてください。 基本的に書き換える必要があるのはDragDropImpl.abpだけでしょう。
その中のDragDropImplがOLEドラッグアンドドロップを受け取る側の肝となります。
ウィンドウ内にドラッグ中のマウスポインタが入ってくると、DragEnterが呼ばれます。
その後マウスポインタが移動する度にDragOverが呼ばれます。
ドロップされるとDrop、ドロップされずにウィンドウから離れていくとDragLeaveが呼ばれます。

肝心の受け取るデータはIDataObjectから取り出せます。
DragEnterで受け取ったIDataObjectへのポインタはDrop/DragLeaveまで、
Dropで受け取ったIDataObjectへのポインタはDrop内の間、(AddRefすることなくとも)有効であるようです。
GetData関数を調べてみてください。


最後に編集したユーザー イグトランス [ 2006年5月29日(月) 21:05 ], 累計 1 回

通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月29日(月) 19:33 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
≫イグトランス様
まとめていただき、大変ありがとうございます。

週末になるまでちょっと時間が取れませんので、
しばらく間が空いてしまいますが、GetDataは後ほど調べてみます。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月03日(土) 19:59 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
≫イグトランス様
頂いたサンプルで動作テスト中です。
引用:
> GetData関数を調べてみてください。
このGetDateメンバ関数なのですが、これも仮想関数ですよね?
というこは、Dropメンバ関数など同様に実装する必要があるのではないでしょうか?
Thunk.sbpに関して
「単にCOMやOLEを使いたいだけならあまりじろじろ覗かないことをお勧めします。」
とのことですが、
『IDropTarget→継承して実装→DropTargetImpl』の流れと同様に
Thunk.sbpのようなAB用の中継ファイル?を作る必要があるのではないでしょうか?


と言うわけで、現在Thunk.sbpを見ながらオーバーライドの仕方を
調べているところです^^;


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月03日(土) 22:50 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
一通り目を通してみましたが、
COMの仮想関数と思われるGetData()の実装方法が分かりません・・・。


IDropTargetインターフェース?のThunk.abpによる実装方法を見ると、
 1、メソッドを実装したDropTargetImplクラスのインスタンスを作る。
   この際に、DropTargetImplThunkクラスを継承しており、
   それのvtableメンバが仮想関数の関数ポインタと
   実装されたメソッドの関数ポインタを繋ぐ役割を果たす。

 2、CreateDropTargetImpl()によって、上記のポインタ同士の
   接続を行う。(vtableへの関数ポインタの代入?)

 3、接続の終わったDropTargetImplクラスのポインタを
   IDropTargetクラスのポインタへキャストする。
とすることで、無理やり実装しているように思えました。

この理解があっているとすると、
ユーザーがインスタンスを作成するクラスであれば、
上記の方法で実装可能ですが、
IDataObjectのように、コールバックで生成される(?)クラスの
実装には使えないように思えます。

・・・それとも、具体的には、Drop関数の引数に与えられる
pDataObj As *IDataObject
が、vtableメンバを持っており、そこの4番目の要素に
実装したGetData()の関数のポインタを代入してから
利用すればよい、ということなのでしょうか?
(※最初の3つの要素はIUnknownと理解しています。)
と思ってやってみましたが、やっぱりダメですね・・・。
引用:
COMインターフェイスの実装にクラスを使うことはできないと思います。
この部分が最大のネックに感じました。



もっとも。
GetData()の実装方法が分かっても、
その実装コードの組み方自体もよく分からないという問題がまだありますが(汗)。
http://hp.vector.co.jp/authors/VA016117 ... drop3.html
あたりを見てはいますが・・・どのメンバにどういう形式でデータが
格納されているのかすら分からない・・・(困)。

どこかでCOMインターフェース自体の勉強してきてからじゃないとハードルが高過ぎるみたいです(苦笑)。

なお、Dropの部分は以下のように実装しようと思っています。


通報する
ページトップ
投稿記事Posted: 2006年6月04日(日) 01:55 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
ABのみでの実現を一端諦め、
とりあえずはIEからのD&Dを実現しよう、
ってことでDLLを用いたアプローチです。

http://www5d.biglobe.ne.jp/~pata/wintool.htm
ここの、OleDragDrop.DLLを利用します。

結論から言うと、D&DのEnter・Over・Leaveは認識できるのですが、
なぜかDropだけが認識できません・・・。
OLEドラッグ&ドロップ、なんでこんなに手ごわいんだ_| ̄|○ なお、環境はWin2000+AB4.23です。
とりあえず、今夜はここで挫折(T_T)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月04日(日) 11:45 
GetDataを含め,IDataObjectはドラッグアンドドロップを開始する側が実装するので,
今回のように受け取る側は実装する必要はありません。
「GetData関数を調べてみてください」というのは使い方を調べてくださいという意味です。
はっきりと書かず意味が伝わらなかったようですみません。

この前のサンプルからの差分です。

新たなInterface.sbpです。全て置き換えてください。どこを修正したか記憶が曖昧だったので全て載せてしまいました。 DragDropImpl.abpのDropTargetImplクラスのDropは次のようになります。 FORMATETCに受け取れるデータの種類を指定し、(ここではHGLOBALに入っているCF_TEXT)
GetDataに渡すと、その種類のデータがあればS_OKを返しSTGMEDIM型のオブジェクトにデータを入れてきます。
FORMATETCのcfFormatにはGetClipboardDataに指定できる定数がそのまま使えます。
FORMATETCのtymedはそれに合わせて適当な形式を選べばよいようです。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年6月05日(月) 17:17 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
無事にIEからD&Dで受け取ることが出来ました。
引用:
> GetDataを含め,IDataObjectはドラッグアンドドロップを開始する側が実装するので,
> 今回のように受け取る側は実装する必要はありません。
> 「GetData関数を調べてみてください」というのは使い方を調べてくださいという意味です。
> はっきりと書かず意味が伝わらなかったようですみません。
そういうことだったのですか・・・。すいません、思いっきり勘違いしていました。
なぜか形式指定を「CF_HDROP」と思い込んでいました。
STGMEDIUM構造体に何も代入されないので、
てっきり実装の必要があるものだとばかり・・・。

具体的なサンプルまで書いていただいて、お手数おかけしました。
ありがとうございました。


通報する
ページトップ
 記事の件名: まとめ。
投稿記事Posted: 2006年6月06日(火) 00:24 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
せっかくなので、
「ライブラリに手を加えることなく、
 簡単にOLEドラッグ&ドロップ(IEからのドロップ)を扱う。」
のコンセプトでまとめてみます。

AB4限定。

必要な宣言など。 動作を定義した本体。 補完ファイル。 ライブラリ内部を全く見ないで扱うためにまとめた関数。
使い方。
D&Dを受け付ける窓のCreateイベントなどで、
Function OleDragDropWatcher_Create( hWnd As Long ) As Long
を実行。
返り値は後に使うので[Dim hDrop As HANDLE]などに保持。

受け入れなくするときは(通常はDestroyイベントで)
Sub OleDragDropWatcher_Destory( pHandle As Long )
を実行。引数は上記の返り値[hDrop]を指定。

ファイル、もしくはIEリンクがD&Dが行われると、
指定した窓プロシージャにWM_OLEDROP_NOTIFYが送られる。
wParam As WPARAMにはドロップされた種類が格納される。
リンクならば、[OLEDROP_MSG_DropLink]
ファイルならば、[OLEDROP_MSG_DropFile]
そのリンク(URL)と、ファイル(フルパス)がlParam As LPARAMに
BytePtr型で与えられる。


以上、通常のD&Dを意識してまとめて見ました。
内部は私自身も良く分かってないところが残ってますが、参考までに。


イグトランス様、本当にありがとうございましたm(_ _)m


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月07日(水) 23:47 
オフライン

登録日時: 2005年5月31日(火) 20:14
記事: 203
お住まい: 兵庫県
ここを覗く時間が最近取れていなかったのですが…
なんとAB単体でできる方法が完成している!?いや、恐れ入りました…。
元はと言えば自分が「OLEドロップを使えばどうか」と言ったのが始まりでしたから、お手数をおかけして本当に申し訳ないです。
時間のあるときに私も試してみますね。(これでDLL添付から解放される^^;)

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 12 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[19人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean