tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルLoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12641
投稿日: 2008/06/26(Thu) 21:33
投稿者よし
お世話になっております。

BMP画像のリソースを含んだVC++ 6.0 で作成したDLLから、
VB6.0 SP6 にてLoadBitmapを使って、そのBMPのリソースのハンドルを取得し、
取得したハンドルを使用して、PictureBoxにBMPを描画できないか考えております。

同様にVC++6.0のDLL には、ストリングテーブルで文字列のリソースもあり、
それらはLoadstringで問題なくVB6に取得できています。
LoadBitmapも返り値はエラー(=0)でないので動作はしていると思っています。
ハンドル値の取得後の処理に行き詰っております。

BMPリソースのハンドル値を使ってPictureboxに描画する方法をご存じの方が
いらっしゃいましたら教えて頂けますでしょうか。
よろしくお願いいたします。

ソース一部
hndl = Loadlibrary(DLLファイル名)
lngRet = LoadBitmap(hndl,100)      '100で表示したいビットマップを特定。
lngRet には0以外の値が返ります。

[ツリー表示へ]
タイトルRe: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12643
投稿日: 2008/06/27(Fri) 08:37
投稿者K.J.K.
OleCreatePictureIndirect 関数について調べてください。

[ツリー表示へ]
タイトルRe^2: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12645
投稿日: 2008/06/27(Fri) 15:52
投稿者よし
ご返答ありがとうございます。

OleCreatePictureIndirectの検索でK.J.K.さんのサイトにたどり着きました。
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/#else

サンプルH2PObj2.lzhをダウンロードして、試させてもらっております。
OleCreatePictureIndirectの第二引数のコンパイルエラーで行き詰っております。
エラーは、「Byref引数の型が一致しません。」です。

該当のサンプルは、そのままではコンパイルできないということで、
タイプライブラリの参照設定と、下記の定義を追加いたしました。

Private Type TGUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type

Private Declare Function OlePictureCreateIndirect _
    Lib "olepro32.dll" Alias "OleCreatePictureIndirect" _
( _
    lpPictDesc As TAutPictDesc, _
    RefIID As TGUID, _
    ByVal fOwn As Long, _
    ByRef lpvObj As Picture _
) As Long

恥ずかしながら結構時間をかけたのですが、解決方法を見つけられませんでした。
大変恐縮ですが、これについてアドバイスいただけますでしょうか。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12646
投稿日: 2008/06/27(Fri) 18:02
投稿者K.J.K.
> サンプルH2PObj2.lzhをダウンロードして、試させてもらっております。

それではなくて、 H2PObj.lzh の方(2が付いてない方)です。

[ツリー表示へ]
タイトルRe^2: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12647
投稿日: 2008/06/27(Fri) 18:40
投稿者よし
> > サンプルH2PObj2.lzhをダウンロードして、試させてもらっております。
>
> それではなくて、 H2PObj.lzh の方(2が付いてない方)です。

すみません。未完成という言葉に、何も考えずにスルーしてしまいました。
このサイトに提供いただいているサンプルのおかげで実現することができました。
大変助かりました。ありがとうございます。

[ツリー表示へ]
タイトルRe: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12764
投稿日: 2008/07/12(Sat) 21:30
投稿者よし

大変お世話になっております。記事No,12641と同じ状況下なのですが、

VC6で作成したDLLにiconをリソースとして登録し、Bitmapと同じように
VB6で使用したいと考えております。

ビットマップのときはLoadBITMAPでハンドル値を取得して、
OleCreatePictureIndirectを使用して、VB6のPictureboxに表示できました。

ご提示いただいたサンプルにならって、
LoadBitmapに置き換えて、アイコンではLoadIcon、ExtractIconなどで
試してみたのですが、ハンドル値が0で返り取得できません。

DLLのリソースアイコンのハンドル値を取得する方法を教えて頂けますでしょうか。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12769
投稿日: 2008/07/13(Sun) 10:41
投稿者K.J.K.
> LoadBitmapに置き換えて、アイコンではLoadIcon、ExtractIconなどで
> 試してみたのですが、ハンドル値が0で返り取得できません。

LoadIcon で取得できるはずですけれどもね。指定する値が正しいのか
チェックしてください。

最近では Bitmap も Icon も LoadImage 関数で取得するのが一般的なようです。

[ツリー表示へ]
タイトルRe^2: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12817
投稿日: 2008/07/23(Wed) 14:03
投稿者よし
> > LoadBitmapに置き換えて、アイコンではLoadIcon、ExtractIconなどで
> > 試してみたのですが、ハンドル値が0で返り取得できません。
>
> LoadIcon で取得できるはずですけれどもね。指定する値が正しいのか
> チェックしてください。
>
> 最近では Bitmap も Icon も LoadImage 関数で取得するのが一般的なようです。

割り込み作業が入り、これに着手できずにおりました。
返信が遅れまして申し訳ありません。

引数の値を確認しましたが、うまくいきませんでした。

ためしたケースは
A = LoadImage(Hndl, "DISPICON", 1, 16, 16, 0)
A = LoadImage(Hndl, 2, 1, 16, 16, 0)
A = LoadIcon(Hndl, 2)
の3つです。

A = LoadBitmap(Hndl, 3)
でビットマップイメージは引っ張れました。

"Hndl"は、VisualStudio C++ で作成したリソースのみのDLLから取得したハンドル値です。
"DISPICON"はそのDLLをビルドするとresource.hに書きこまれる対象のアイコンの名前で、
"2"は、その識別子です。

誤り等、ありましたらご指摘いただけますでしょうか。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12818
投稿日: 2008/07/23(Wed) 16:41
投稿者K.J.K.
> A = LoadIcon(Hndl, 2)

LoadImage や LoadIcon の宣言 (Declare) はどうなっていますか?
リソースの名前を指定するところが、
ByVal ResourceID As Long
ならば、数字で、
ByVal ResourceName As String
となっていたら、文字列でそのまま渡せますが、
ResourceIDorName As Any
とでもなっているのならば、
ByVal 2&
とか
ByVal "DISPICON"
ByVal "#2"
とかと渡さないと駄目でしょう。

[ツリー表示へ]
タイトルRe^2: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12819
投稿日: 2008/07/23(Wed) 18:35
投稿者よし
> > A = LoadIcon(Hndl, 2)
>
> LoadImage や LoadIcon の宣言 (Declare) はどうなっていますか?
> リソースの名前を指定するところが、
> ByVal ResourceID As Long
> ならば、数字で、
> ByVal ResourceName As String
> となっていたら、文字列でそのまま渡せますが、
> ResourceIDorName As Any
> とでもなっているのならば、
> ByVal 2&
> とか
> ByVal "DISPICON"
> ByVal "#2"
> とかと渡さないと駄目でしょう。

K.J.K.さま

ご回答いただきありがとうございます。

定義ですが下記のように行っております。
LoadIconについては、第一引数がLongで、第二引数がStringなので、
問題ないように思うのですが、うまくいきません。

Declare Function LoadIcon Lib "user32" Alias "LoadIconA" _
(ByVal hndl As Long, ByVal Icon As String) As Long

Public Declare Function LoadImage Lib "user32" Alias "LoadImageA" _
(ByVal hndl As Long, ByVal size As String, ByVal un1 As Long, _
ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long

アイコンを持つDLLの方に問題がある可能性を考えるべきでしょうか。
お手数をおかけいたしますが、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12820
投稿日: 2008/07/23(Wed) 20:23
投稿者K.J.K.
> LoadIconについては、第一引数がLongで、第二引数がStringなので、
> 問題ないように思うのですが、うまくいきません。

第2引数も ByVal ... As Long にしてみるとどうなります?

[ツリー表示へ]
タイトルRe^2: LoadBitmapでVC6のDLLからbitmapを取得して描画。
記事No12821
投稿日: 2008/07/23(Wed) 20:51
投稿者よし
> > LoadIconについては、第一引数がLongで、第二引数がStringなので、
> > 問題ないように思うのですが、うまくいきません。
>
> 第2引数も ByVal ... As Long にしてみるとどうなります?

ご指摘ありがとうございます。
申し訳ありません。
まったくの注意不足、思い込みでした。
ご指摘の通りでした。長らくお手数をお掛けして申し訳ありませんでした。
ありがとうございました。

[ツリー表示へ]