C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.75310 の関連記事表示

<< 0 >>
■75310  Re[2]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ とら -(2015/03/12(Thu) 21:59:05)
    No75306 (魔界の仮面弁士 さん) に返信


    >>VB6.0で作成した実行ファイルからVC++6.0で作成したDLLに値を参照渡ししているものがあり、
    >>このたびVB.net2008にアップグレードする事になりました。
    >
    > この文章だけだと、VB6 EXE から VB2008 DLL を呼ぶ方向にも読み取れてしまいますね。
    >
    > なお、製品名に .NET の名を冠するのは 2003までなので、
    > 正確には、VB.net2008 → VB2008 だったりしますが、それはさておき。

    なるほど、以後留意致します。



    >>アップグレードウィザードを通してエラーや警告を除外した後に
    >
    > 提示されたコードは恐らく、実際のコードとは別物ですよね。
    > (実コードを貼り付けたなら、as が小文字表記されているはずが無いので…)
    >
    > 「改修に失敗している現在のコード」だけではなく、
    > 「正常動作している改修前のコード」も提示していただけないでしょうか。
    > もしくは DLL 側のコードでも良いですけど。

    アップグレードとエラー及び警告の対応は他の方がされていたので少々混乱しておりました。

    アップグレード前のVB6.0の該当部分のソースになります。

    -- 宣言部 ----

    Declare Function Test1 Lib "TestFunc.DLL" (oStructure() As Any) As Long

    Public Structure Structure1
    Dim int1 As Long
    Dim int2 As Long
    Dim int3 As Long
    End Structure


    '配列の作成(10個の配列として宣言)
    Public oStructure1(0 To 9) As Structure1


    -- 処理 ----

    'DLLの呼出し
    Dim iRet as integer = -1
    iRet = Test1(oStructure1())


    >> Public Structure Structure1
    > 構造体には StructLayoutAttribute を明示しておくことをお奨めします。
    > たとえば、その DLL のパッキングサイズが 4 バイト単位なら、
    > 『<StructLayout(LayoutKind.Sequential, Pack:=4)>』など。
    >
    >> '呼出し後に参照で渡した(oStructure1)の数が1つになっている
    > 引数に MarshalAsAttribute を付与しておいてください。
    > SizeConst が指定されていない場合、マーシャリングされるのは 1 つの要素だけだったはず。
    >
    >>色々調べてみたところ、値渡しにすると大丈夫(配列なのでそもそも参照型だから参照の値渡しになる)
    >>といった記述があったので試してみたのですが、配列は10のままで戻ってくるようになったのですが、
    >>値が格納されていません。
    > 配列を値渡しした場合、それは In パラメーターとしてマーシャリングされるためかと。
    > 結果を受け取る必要があるのなら、<InAttribute(), OutAttribute()> を付与しておいてください。


    取り急ぎ、宣言部を下記のようにByValに変更し<InAttribute(), OutAttribute()> を付与してみましたが
    配列数は10になったものの値は変わっていませんでした。

    Imports System.Runtime.InteropServices

    Declare Function Test1 Lib "TestFunc.DLL" (<InAttribute(), OutAttribute()> ByVal oStructure() As Structure1) As Long



    確認は明日になりますが、引き続き宜しくお願い致します。
記事No.75306 のレス /過去ログ127より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -