VBで以下のように定義した配列を
Public Type test
sts As String * 2
err As String * 4
war As String * 2
End Type
Dim a(11) As test
VC側のdllで配列として処理したいのですがどのようにしたらいいのでしょうか?
for (i=0;i<12;i++){
for (j=0;j<2;j++)
test->Status=tsuushin[i].str[j];
for (j=4;j<8;j++)
test->Error[j-4]=tsuushin[i].str[j]; for(j=10;j<12;j++)
test->Warning[j-10]=tsuushin[i].str[j];
}
}
tsuushin[12].str[20]はchar型で10H 0001H 01Hと文字列が入っています。
testと言う12個の配列変数に10H 0001H 01Hをスペースごとに区切って
数値部分だけ代入しようとしているのですが、うまくいきません。
上記のプログラムでtestをtest[i]として処理したいのです。
どなたかご教授お願いいたします。
最近同じような質問に解答しました。
参考にしてください。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?mode=allread&no=5900&page=0
の
Blue 02/26-14:35 No.5917
に具体的なソースがあります。
コメントにもありますが、
> wchar_t Code[ 4 ];
のようにすると、終端文字(L'\0')が含まれないので注意が必要です。
> Public Type test
> sts As String * 2
> err As String * 4
> war As String * 2
> End Type
の場合は
typedef struct tagTest
{
wchar_t str[ 2 ]; /* 2Byte * 2 = 4Byte OK! */
wchar_t err[ 4 ]; /* 2Byte * 4 = 8Byte OK! */
wchar_t war[ 2 ]; /* 2Byte * 2 = 4Byte OK! */
} test;
でいけると思います。
追記)
固定長文字列メンバがなければ更に簡単です。
C言語を意識して、
> Public Type test
> sts As String * 2
> err As String * 4
> war As String * 2
> End Type
と宣言しているのならば、
Public Type test
str As String
err As String
war As String
End Type
typedef struct tagTest
{
BSTR str;
BSTR err;
BSTR war;
} test;
とすることで、終端文字の存在を意識せずに扱えます。
ただし、あちらの掲示板でも書きましたけど、文字コードが全て Unicode になるので、注意が必要です。
たびたびスイマセン。
> 数値部分だけ代入しようとしているのですが
代入を考えているとなると、固定長の時はやったことないんでなんともいえない
(そのままwcsncpyでいけそう)のですが、
BSTRの変数に入れる場合、C言語の領域とVBで使う領域は違いますので、SysAllocString関数を使って入れないといけません。
というか、VBというよりVCの質問ですな。
お返事ありがとうございます。
MSDNにサンプルがあるのがわかっただけでありがたいです。
サンプル見ながらやってみます。
ありがとうございます。
サンプルを見たのですが、知らない関数ばかりでよくわかりません・・・
サンプルのコード書いてくれるやさしいお方がいらっしゃいましたら
よろしくお願いします。
> サンプルを見たのですが、知らない関数ばかりでよくわかりません・・・
どこがわからないのかはっきりと書きましょう。
あれだけヒントを挙げたのに。。。
それと、VCのコードをVBの掲示板で聞くところではないので、次回から
妥当な掲示板で質問してください。
typedef struct tagErrorInfo
{
wchar_t Stauts[ 2 ];
wchar_t Error[ 4 ];
wchar_t Warning[ 2 ];
} ErrorInfo;
void WINAPI Sample( LPSAFEARRAY* args )
{
SAFEARRAY* psa = *args;
long idx, lb, ub;
int s, e, w;
ErrorInfo ei;
SafeArrayLock( psa );
SafeArrayGetLBound( psa, 1, &lb );
SafeArrayGetUBound( psa, 1, &ub );
for ( idx = lb; idx <= ub; idx++ )
{
SafeArrayGetElement( psa, &idx, &ei );
sscanf( "10H 0001H 01H", "%dH %dH %dH", &s, &e, &w );
swprintf( ei.Stauts, L"%02d", s );
swprintf( ei.Error, L"%04d", e );
swprintf( ei.Warning, L"%02d", w );
SafeArrayPutElement( psa, &idx, &ei );
}
SafeArrayUnlock( psa );
}
> swprintf( ei.Stauts, L"%02d", s );
> swprintf( ei.Error, L"%04d", e );
> swprintf( ei.Warning, L"%02d", w );
これ間違っていました。
領域超えて設定しちゃっていますのでこのままではダメです。
wchar_t buff[ 8 ];
swprintf( buff, L"%02d", s );
wcsncpy( ei.Stauts, buff, 2 );
swprintf( buff, L"%04d", e );
wcsncpy( ei.Error, buff, 4 );
swprintf( buff, L"%02d", w );
wcsncpy( ei.Warning, buff, 2 );
VBの掲示板だったんですか・・・
知らなかったもので。
サンプルのコードありがとうございます。
ツイート | ![]() |