VCで作るdllにVBで作ったユーザー定義型の構造体を配列で渡すには。

解決


N  2006-03-03 22:56:43  No: 130546

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]として処理したいのです。
どなたかご教授お願いいたします。


Blue  2006-03-03 23:08:07  No: 130547

最近同じような質問に解答しました。
参考にしてください。
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;
でいけると思います。


Blue  2006-03-03 23:13:58  No: 130548

追記)

固定長文字列メンバがなければ更に簡単です。
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 になるので、注意が必要です。


Blue  2006-03-03 23:22:00  No: 130549

たびたびスイマセン。

> 数値部分だけ代入しようとしているのですが
代入を考えているとなると、固定長の時はやったことないんでなんともいえない
(そのままwcsncpyでいけそう)のですが、

BSTRの変数に入れる場合、C言語の領域とVBで使う領域は違いますので、SysAllocString関数を使って入れないといけません。

というか、VBというよりVCの質問ですな。


N  2006-03-03 23:25:36  No: 130550

お返事ありがとうございます。
MSDNにサンプルがあるのがわかっただけでありがたいです。
サンプル見ながらやってみます。
ありがとうございます。


N  2006-03-04 01:28:08  No: 130551

サンプルを見たのですが、知らない関数ばかりでよくわかりません・・・
サンプルのコード書いてくれるやさしいお方がいらっしゃいましたら
よろしくお願いします。


Blue  2006-03-04 01:59:05  No: 130552

> サンプルを見たのですが、知らない関数ばかりでよくわかりません・・・
どこがわからないのかはっきりと書きましょう。

あれだけヒントを挙げたのに。。。
それと、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 );
}


Blue  2006-03-04 02:04:54  No: 130553

>         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 );


N  2006-03-04 02:19:59  No: 130554

VBの掲示板だったんですか・・・
知らなかったもので。
サンプルのコードありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加