掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
.NETによるVCのDLLへ構造体配列を引き渡す方法について (ID:110271)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ひとまず、 構造体のみで渡してみたら、その場合はうまく行くのに? 構造体配列になると無理でした。 VB−−−− <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _ Public Structure EMPLOYEE Dim Name As String Dim Address As String Dim Age As Short End Structure Private Declare Function func Lib "vc.dll" (ByRef emp As EMPLOYEE) As Integer Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click Dim emp As EMPLOYEE foo(emp) ' ← 構造体の引渡しをしてみました。 End Sub VC−−−− typedef struct { BSTR Name; BSTR Address; short Age; } EMPLOYEE; extern "C" __declspec(dllexport) int __stdcall func(EMPLOYEE *ppsa); extern "C" __declspec(dllexport) int __stdcall func(EMPLOYEE *ppsa) { char Name[128]; char Address[128]; short Age; static wchar_t bufw[FOOBUFSIZE]; setlocale( LC_ALL, "" ); ::SysFreeString( ppsa->Name ); ::SysFreeString( ppsa->Address ); // とりあえず、構造体へデータを設定してみました。 memset( Name, NULL, sizeofName); memset( Address, NULL, sizeof(Address) ); sprintf( Name, "vc−testname−−−−−−★!" ); sprintf( Address, "vc−testaddress−−−−−−★!" ); Age = 10; mbstowcs(bufw, Name, FOOBUFSIZE); ppsa->Name = ::SysAllocString( bufw ); mbstowcs(bufw, Address, FOOBUFSIZE); ppsa->Address = ::SysAllocString( bufw ); ppsa->Age = Age; return 0; } これがうまくいったので、 単純な配列として扱えればいいなぁとやってみたのですが、飛んでしまいました。 単純にVCで引数を配列のように使っても駄目みたいです。 一応、 VBから配列の1エントリ毎にCALLすると動くみたいでした。 VB−−−− Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click Dim emp(2) As EMPLOYEE foo(emp(0)) ' ← 構造体(1番目)の引渡しをしてみました。 foo(emp(1)) ' ← 構造体(2番目)の引渡しをしてみました。 foo(emp(2)) ' ← 構造体(3番目)の引渡しをしてみました。 End Sub これなら、 設定できるんですが、配列としての処理方法は無いのでしょうか? VB6.0からはVC++での処理は可能なので、 VB側の設定を変更してVB6.0のように渡すことはできませんか? StructLayoutAttribute属性クラス MarshalAsAttribute属性クラス についてもヘルプを見たりしたのですが、 使い方が分かりませんでした。 どこかにサンプルソースなどがあればご教授願います。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.