tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWIAからのファイルのドラッグについて
記事No13015
投稿日: 2008/09/05(Fri) 15:07
投稿者ポンカム
フォームにドラッグされたJpegファイルをピクチャボックスに表示する部分で困っています。
エクスプローラからドラッグしたJpegファイルは正常に表示されるのですが、CANONのデジカメを直接USBでつなげた際、マイコンピュータに表示されるデジカメを開き、その中のJpegファイルをフォームにドラッグすると「OLEDragDrop」イベントは発生するのですが、受け取ったDataObjectを参照すると「データの形式が一致しません。」となってしまいます。
マイコンピュータに表示されたデジカメは、WIAにて表示されたもので、通常のエクスプローラから見たファイルとは違うからなのではないかと思うのですが、なにか方法をご存知の方いらっしゃいませんでしょうか。

<環境>
 ・WindowsXP Pro SP3
 ・VB6.0 SP5
<デジカメ>
 ・CANON PowerShot A530
  ドライバなどはインストールしていません。繋げると自動認識しました。

<ソース>
 1.プロジェクトの新規作成
 2.フォームの「OLEDropMode」を「手動」に設定
 3.フォームにピクチャボックスを作成
 4.以下のコードを作成

Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Set Picture1.Picture = LoadPicture(Data.Files(1))
End Sub
 テスト用のコードなので、ファイルのチェックなどの処理は省いてあります。

 よろしくお願い致します。

[ツリー表示へ]
タイトルRe: WIAからのファイルのドラッグについて
記事No13018
投稿日: 2008/09/05(Fri) 18:55
投稿者花ちゃん
> Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
>     Set Picture1.Picture = LoadPicture(Data.Files(1))
> End Sub

この時の Data.Files(1) の中身はどのようになっていますか? ファイルの拡張子は?
(拡張子によっては、直接ピクチャボックスに表示する事が出来ない場合があります)

エクスプローラからデジカメのスマートメディアにアクセスできないのでしょうか?
私が今まで使っていたデジカメは、すべて、USB に接続したデジカメのデータは
通常のUSBの flash ディスク と同様の動作で取得・アクセスできましたが。

又は、カードリーダ(2千円弱)を使用すれば、直接メモリカードから読み取る事ができます。

>   ドライバなどはインストールしていません。繋げると自動認識しました。
OS にデフォルトでインストールされていた分を認識したかと?
最新のドライバーは下記のようですが?
Canon Camera WIA Driver Ver6.4.2
http://cweb.canon.jp/drv-upd/digitalcamera/wcm642.html

[ツリー表示へ]
タイトルRe^2: WIAからのファイルのドラッグについて
記事No13027
投稿日: 2008/09/09(Tue) 09:39
投稿者ポンカム
 お返事頂きありがとうございます。

> この時の Data.Files(1) の中身はどのようになっていますか? ファイルの拡張子は?
> (拡張子によっては、直接ピクチャボックスに表示する事が出来ない場合があります)
 
 このData.Files(1)を参照しようとした時点で「データの形式が一致しません。」というエラーが発生してしまいます。

> エクスプローラからデジカメのスマートメディアにアクセスできないのでしょうか?
> 私が今まで使っていたデジカメは、すべて、USB に接続したデジカメのデータは
> 通常のUSBの flash ディスク と同様の動作で取得・アクセスできましたが。

 CANONのデジカメですとデジカメを直接繋げるとドライブとして認識されるのではなく、デバイスとして認識され、「スキャナとカメラ」として認識されてしまいます。
 通常のドライブと違い操作はWIAドライバを介して行われているようで、エクスプローラで開けるように見えて実はWIAドライバを介いしてしまっているので、プログラムから操作しようとするとうまくいかないようです・・・
 
 気になったのが、ファイルを開くボタンを「CommonDialog」にて作成し、デジカメ内のJpegファイルを指定した際に取得できるファイルパスが、
「C:\Documents and Settings\(ユーザ名)\Local Settings\Temporary Internet Files\Content.IE5\Y5HXPBIV\IMG_0901[2].jpg」
というようなIEのテンポラリフォルダになっています。この「CommonDialog」でファイルを指定した場合はファイルパスを取得できますので、ピクチャボックスに表示できます。


> 又は、カードリーダ(2千円弱)を使用すれば、直接メモリカードから読み取る事ができま す。
 
 最終的にはその方法しかないですね。なんとかプログラムの方で対応できれば一番なのですが;

> OS にデフォルトでインストールされていた分を認識したかと?
> 最新のドライバーは下記のようですが?

 お調べ頂きありがとうございます。
 早速試してみたのですが、やはり結果は上記のエラーとなってしまいました。


 「CommonDialog」にて開いた際、IEのテンポラリパスが取得される当たりをもうちょっと調べてみます。また進展ありましたら書き込みさせて頂きます。

[ツリー表示へ]
タイトルRe^3: WIAからのファイルのドラッグについて
記事No13028
投稿日: 2008/09/09(Tue) 10:13
投稿者花ちゃん
>  「CommonDialog」にて開いた際、IEのテンポラリパスが取得される当たりをもうちょっと調べてみます。また進展ありましたら書き込みさせて頂きます。

上記を使用した事がないので定かではありませんが、確か、取得時(上記で表示時)に
拡張子の指定ができるような事がどこかで書いてあったと思ったのですが、オプションの
設定とかにありませんか?

>このData.Files(1)を参照しようとした時点で「データの形式が一致しません。」というエラーが発生してしまいます。
調べている時点が悪いのでは?
ドラッグしている時ならどうですか?

[ツリー表示へ]
タイトルRe: WIAからのファイルのドラッグについて
記事No13029
投稿日: 2008/09/09(Tue) 14:46
投稿者K.J.K.
例えば、

Private Declare Function GetClipboardFormatName _
    Lib "user32.dll" Alias "GetClipboardFormatNameA" _
(ByVal FormatID As Long, ByVal Buffer As String, ByVal Length As Long) As Long

Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, _
    Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim iLoop As Integer
    If Data.GetFormat(vbCFFiles) Then
        Set Picture1.Picture = LoadPicture(Data.Files(1))
    Else
        For iLoop = &HC000 To &HFFFF
            If Data.GetFormat(iLoop) Then Debug.Print GetFormatName(iLoop)
        Next iLoop
    End If
End Sub

Private Function GetFormatName(ByVal FormatID As Integer) As String
    Dim sBuffer As String
    Dim iID As Long
    sBuffer = String$(256&, vbNullChar)
    iID = CLng(FormatID) & &HFFFF&
    If GetClipboardFormatName(iID, sBuffer, 255&) Then
        GetFormatName = Strings.Left$(sBuffer, InStr(1&, sBuffer, vbNullChar) - 1&)
    End If
End Function

などして、実際に使われているデータ転送のフォーマットを調べてみるとか。

[ツリー表示へ]