- PR -

VB.netからCへ渡す構造体

投稿者投稿内容
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-04-13 18:57
お世話になっております

 VB.NET2003 WindowsPG で
 DllImport を 使用して Cで作成されたDllに
 C側の構造体に値を渡したいのですが
 どなたか ご経験ありませんでしょうか

試したこと
 integer long string を単項目ずつ渡す方法では
 想定通りに値が渡ります

VB.NET にて

  CALL部分
Dim sts As sPOINT
With sts
.lA = 1000
.lB = 200
End With
Dim RetVal As Long
RetVal = KesanT(sts)

DLLImport部分
<DllImport("TestPG.dll", EntryPoint:="testD", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function _
KesanT(ByRef r As sPOINT) As Long
' This function copies a file from the path src to the path dst.
End Function

構造体定義部分
Structure sPOINT
Public lA As Long
Public lB As Long
End Structure

C 計算部分

long __stdcall testD(PJKESAN_RESULT pjkr)
{
long d;
d = pjkr->lA +
pjkr->lB;
return d;
}



c 構造体

typedef struct tagJKESAN_RESULT {
long lA;
long lB;

} JKESANRESULT, *PJKESAN_RESULT;

VBと通信する構造体のバイトアライメントは4バイト


結果が 必ず0になります

 ご教授の程 よろしくお願い致します



Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-04-13 19:20
C の long は一般に 32bits/4bytes ですよ。
さて、VB.NET の Long は何バイトの値でしょう?
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-04-13 19:29
引用:

Hongliangさんの書き込み (2007-04-13 19:20) より:
C の long は一般に 32bits/4bytes ですよ。
さて、VB.NET の Long は何バイトの値でしょう?



すみません
Long を Int32 に変えてみました が 結果同じで・・・・
安直?

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-04-13 20:07

StructLayoutAtributeを指定する必要があるのではなくて?
VC++のデフォルトのアライメントはDDWORDなんだけど大丈夫?
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-04-13 20:21
引用:

甕星さんの書き込み (2007-04-13 20:07) より:

StructLayoutAtributeを指定する必要があるのではなくて?
VC++のデフォルトのアライメントはDDWORDなんだけど大丈夫?



ありがとうございます
Vも+もつかない C なんです 

ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-13 20:34
引用:

七さんの書き込み (2007-04-13 20:21) より:

ありがとうございます
Vも+もつかない C なんです 


えーと、ちょっと話が見えませんが…
Vも+もつかないCで、Windows用のDLLを作成している、ということ?

いやまあ、それはそれで華麗にスルーしてみるとしても、反応すべき場所
はそこではないはず。

引用:

甕星さんの書き込み (2007-04-13 20:07) より:

StructLayoutAtributeを指定する必要があるのではなくて?


StrutLayout 属性というものがあって、それを指定することで構造体の
配置方法を指定することができるわけです。通常は .NET が使いやすい
ようにしちゃってるんだけど、DLL と通信するなら DLL の流儀にあわせな
いといけない。それを指定するのが StructLayout 属性ですよと。

検索したらこんなのが出てきました。参考になるといいですけど。
http://www.atmarkit.co.jp/fdotnet/dotnettips/026w32struct/w32struct.html
# でも本当はこういう「検索」ぐらいは自分でやらなきゃいけないですけどね。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-04-13 21:05
引用:

ぽぴ王子さんの書き込み (2007-04-13 20:34) より:
検索したらこんなのが出てきました。参考になるといいですけど。
http://www.atmarkit.co.jp/fdotnet/dotnettips/026w32struct/w32struct.html
# でも本当はこういう「検索」ぐらいは自分でやらなきゃいけないですけどね。




ありがとうございます
まさしく ご指定のHPにて 今回のソースを作ってます
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-04-13 21:08
引用:

七さんの書き込み (2007-04-13 21:05) より:

ありがとうございます
まさしく ご指定のHPにて 今回のソースを作ってます


ありゃ、そうだったんですか。

その割には StructLayout 属性の指定がないみたいですが…
つけてやってみました?
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)