DOBON.NETプログラミング道掲示板

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

ツリー一括表示

Nomalアイコン VB6からC#への変換時のエラー /Doooo (17/03/16(Thu) 11:25) #33604
Nomalアイコン Re[1]: VB6からC#への変換時のエラー /魔界の仮面弁士 (17/03/16(Thu) 16:10) #33605


親記事 / ▼[ 33605 ]
■33604 / 親階層)  VB6からC#への変換時のエラー
□投稿者/ Doooo 一般人(1回)-(2017/03/16(Thu) 11:25:46)
  • アイコン環境/言語:[VB6,VB2005] 
    分類:[VB6以前] 

    現在、VB6からC#への変換作業を行っています。
    C#の前に、VB2005への変換しているのですが、
    下記のエラーで行き詰まっています。

    どなたかご教授お願い致します。


    なお、エラーは、下記の通りです。
    .lpfn = GetPointer(AddressOf BFFCallback)
    の箇所で、
    「error BC30581: 'Integer' は、デリゲート型でないため、'AddressOf' 式を 'Integer' に変換できません。」

    関係するコードは、下記になります。

    Public Function GetPointer(ByRef lngAddressOf As Integer) As Integer

    コールバック関数のアドレスを返す
    GetPointer = lngAddressOf
    End Function


    Public Function BFFCallback(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal lParam As Integer, ByVal lpData As Integer) As Integer

    フォルダを指定のメッセージをダイアログへ送信
    If uMsg = BFFM_INITIALIZED Then
    Call SendMessage(hwnd, BFFM_SETSELECTIONA, True, lpData)
    End If
    End Function

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 33604 ] / 返信無し
■33605 / 1階層)  Re[1]: VB6からC#への変換時のエラー
□投稿者/ 魔界の仮面弁士 大御所(1067回)-(2017/03/16(Thu) 16:10:59)
  • アイコンNo33604に返信(Dooooさんの記事)
    > .lpfn = GetPointer(AddressOf BFFCallback)

    SHBrowseForFolder API に使う BROWSEINFO 構造体のメンバーでしょうか?

    VB6 当時はおそらく、.lpfn フィールドのデータ型が
    「As Long」あたりであったものと想像しますが、
    .NET の場合は Int32 型ではなく、デリゲート型にする必要があります。

    また、ヘルパー関数として VB6 側に実装されていた
    Function GetPointer も不要なので、削除しておいてください。

    関数ポインタを渡す際には、GetPointer などを中継させずに、
     .lpfn = AddressOf BFFCallback  … VB.NET の場合
     .lpfn = BFFCallback  … C# の場合
    のように直接指定すれば OK です。



    > Public Function BFFCallback(ByVal hwnd As Integer, ByVal uMsg As Integer, ByVal lParam As Integer, ByVal lpData As Integer) As Integer
    hWnd は Int32 ではなく、 IntPtr 型もしくは HandleRef 型にします。
    uMsg は Int32 のままで OK です。本来は UInt32 ですが、Int32 のままの方が使いやすいでしょう。
    lParam / lpData については、本来の型は IntPtr が適切です。

    そして先の .lpfn はこれを受け取るデリゲートなので、lpfn As Integer ではなく
     ' VB
     Public lpfn As Func(Of IntPtr, Integer, IntPtr, IntPtr, Integer)

     // C#
     public Func<IntPtr, int, IntPtr, IntPtr, int> lpfn;
    などのようにします。


    ジェネリックデリゲートだと分かりにくい場合は、
     Public Delegate Function BrowseCallbackProc(ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal lParam As IntPtr, ByVal lpData As IntPtr) As Integer
    のような明示的なデリゲート型を作成しておき、構造体メンバーを
     Public lpfn As BrowseCallbackProc
    としても構いません。



    > Call SendMessage(hwnd, BFFM_SETSELECTIONA, True, lpData)
    現時点では Windows 98 系統の OS もありませんので、
    Unicode 版の SHBrowseForFolder を呼び出すようにした上で、
    BFFM_SETSELECTIONA ( = &H468 ) ではなく
    BFFM_SETSELECTIONW ( = &H469 ) を使った方が良いのではないでしょうか。
違反を報告
[ 親 33604 / □ Tree ] 返信 削除キー/


Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -