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

■34506 / 5階層)  VB6→2005変換時のDeclare宣言のマーシャリング属性
□投稿者/ 魔界の仮面弁士 大御所(1286回)-(2020/07/14(Tue) 05:11:36)
  • アイコン2020/07/14(Tue) 09:09:11 編集(投稿者)

    No34501に返信(naoさんの記事)
    > Option Strict Offになっていますし、

    API を使うなら、できるだけ Option Strict On で動作するようコーディングされることをお奨めします。


    No34499に返信(naoさんの記事)
    > なお、FileTime構造体は以下の通りです。

    実は自前で宣言しなくても、.NET Framework には
    System.Runtime.InteropServices.ComTypes.FILETIME
    という構造体が既に用意されていたりします。


    > 'UPGRADE_WARNING: 構造体 FileTime に、この Declare ステートメントの引数としてマーシャリング属性を渡す必要があります。
    Google ってみたところ、英語版の VS2005 だと、
     'UPGRADE_WARNING: Structure FileTime may require marshalling attributes to be passed as an argument in this Declare statement. Click for more: 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="C429C3A5-5D47-4CD9-8F51-74A1616405DC"'
    になり、VS2003 の場合は、
     'UPGRADE_WARNING: Structure FileTime may require marshalling attributes to be passed as an argument in this Declare statement. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1050"'
    というメッセージになるらしいです。

    手元に ms-help プロトコルを開ける環境が残っていないので未確認ですが、「Visual Studio 2005」と共に
    「Visual Studio 2005 MSDN Library」をインストールしてあればリンクを開けるかもしれません。
    (リンクを開けたとしても、有益な情報を得られない可能性は高そうですが)


    上記リンクについて、何か情報が無いか探してみたのですが、見つかったのはこれぐらい。
    https://www.mobilize.net/vbtonet/ewis/ewi1050
    それっぽいことが書かれているものの、VB6 なのにユーザー定義型を ByRef ではなく ByVal 渡ししている時点で、資料として不自然ですね。

    あとは下記がヒットしました。
    37 ページ目の「3.5.2 Structure may require Marshalling Attributes to be passed as an Argument in this Declare Statement.」の項。

    今回の LocalFileTimeToFileTime のための有益な情報にはなるかどうかは別として、一応参考までに。
    https://www.cs.kau.se/cs/education/courses/davcdiss/Exjobb_2008/C2008-06.pdf



    > Declare宣言時に引数の型に構造体を定義するときの属性は何を渡せばよいのでしょうか?
    > それとも構造体のメンバの方に属性を追加するのでしょうか?

    Hongliang さんご提示の pinvoke.net は私もたびたび参考にさせてもらっていますが、今回の
    LocalFileTimeToFileTime API の宣言は掲載されていないみたいですね。
    FileTimeToLocalFileTime API の宣言は掲載されているのですけれども。

    すでに示されているように、今回の宣言は、自動変換された宣言のままで動くと思います。
    もしあえて修正するとすれば、In 属性および Out 属性を明示して
     ' Imports System.Runtime.InteropServices
     Public Declare Function LocalFileTimeToFileTime Lib "KERNEL32.DLL" (<[In]> ByRef lpLocalFileTime As FileTime, <Out> ByRef lpFileTime As FileTime) As <MarshalAs(UnmanagedType.Bool)> Boolean
     Public Declare Function FileTimeToLocalFileTime Lib "KERNEL32.DLL" (<[In]> ByRef lpFileTime As FileTime, <Out> ByRef lpLocalFileTime As FileTime) As <MarshalAs(UnmanagedType.Bool)> Boolean
    のようにすると良いのではないでしょうか。
    元の Win32 API の戻り値が「BOOL 型」であるため、上記では戻り値も As Boolean に変更してあります。


    No34503に返信(naoさんの記事)
    >>おそらくその警告は、Declare文中にByRefで構造体を渡しているところ全部に自動的に付けられるものかと思います。
    >>提示されているLocalFileTimeToFileTime関数のDeclare文については、特に問題さそうです。
    > 問題があるかないかの判断はどのように考えればよろしいのでしょうか?

    配列や文字列型以外の注意点として思いつくのは、StructLayout 属性の付与とか。

    例えば SHFILEOPSTRUCT 構造体は、StructLayout 属性で Pack:=1 を指定しておかないと、
    fAnyOperationsAborted 以降のメンバー位置がズレてしまうことになります。

    冗長なので、既定の設定のままで問題が無い場合は、属性指定を省略することも多いですが、
    余裕があれば StructLayout 属性にて、CharSet と Pack、時には Size も明示しておいた方が良いと思います。


    その他、個別判断が必要な例としては、 KB161301 の WindowFromPoint API が挙げられます。

    この API の本来の定義は『HWND WindowFromPoint( POINT Point );』なのですが、VB6 の制限により、
    多くの場合、引数定義を (ByVal xPoint As Long, ByVal yPoint As Long) に置き換えて代用されています。
    また、VBA7 でいうところの As LongPtr 型がまだ使えないので、戻り値が As Long で代用されているわけですが、
    これらそれぞれの「As Long」を、.NET の As Integer と As IntPtr に再翻訳する作業は、
    アップグレード ウィザードの自動変換だけではまかないきれないでしょう。
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[4]: VB6→2005変換時のDeclare宣言のマーシャリング属性 /nao →Re[6]: VB6→2005変換時のDeclare宣言のマーシャリング属性 /nao
 
上記関連ツリー

Nomalアイコン VB6→2005変換時のDeclare宣言のマーシャリング属性 / nao (20/07/13(Mon) 17:33) #34499
Nomalアイコン Re[1]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / みい (20/07/13(Mon) 17:58) #34500
│└Nomalアイコン Re[2]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / nao (20/07/13(Mon) 18:58) #34501
Nomalアイコン Re[1]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / Hongliang (20/07/13(Mon) 19:29) #34502
  └Nomalアイコン Re[2]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / nao (20/07/13(Mon) 19:39) #34503
    └Nomalアイコン Re[3]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / Hongliang (20/07/13(Mon) 20:04) #34504
      └Nomalアイコン Re[4]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / nao (20/07/13(Mon) 20:11) #34505
        └Nomalアイコン VB6→2005変換時のDeclare宣言のマーシャリング属性 / 魔界の仮面弁士 (20/07/14(Tue) 05:11) #34506 ←Now
          └Nomalアイコン Re[6]: VB6→2005変換時のDeclare宣言のマーシャリング属性 / nao (20/07/14(Tue) 19:59) #34507

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -