- PR -

C#で作ったCOMにVC++6.0からアクセス

1
投稿者投稿内容
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2004-10-15 01:57
C#で作ったCOMに以下のようなインターフェースを実装しています。

  void set_sequence(string[] value) ;

そして、VC++6.0のプログラムから第1引数に文字列の配列を渡そうとしているのですが、
どうすればよいのかわからずこまっています。
SAFEARRAYというものを使うというところまではわかったのですが、
いろいろと見よう見まねでやってみてもダメでした。
どなたか方法をご教授願えませんでしょうか?

(どちらかというと.NETの質問ではないですが、どうかよろしくお願いします。)
chack
常連さん
会議室デビュー日: 2002/11/18
投稿数: 48
お住まい・勤務地: 埼玉県
投稿日時: 2004-10-15 20:13
以下のコードではどうでしょうか?

コード:
  // VC++ 側
  SAFEARRAY* psa = ::SafeArrayCreateVector(VT_BSTR, 0, 3);
  if (psa != NULL)
  {
    BSTR* bstrArray;
    HRESULT hr = ::SafeArrayAccessData(psa, (LPVOID*)&bstrArray);

    bstrArray[0] = ::SysAllocString(L"あいうえお");
    bstrArray[1] = ::SysAllocString(L"かきくけこ");
    bstrArray[2] = ::SysAllocString(L"さしすせそ");

    hr = ::SafeArrayUnaccessData(psa);

    hr = pFoo->set_sequence(psa);  // COM Method.

    for (ULONG i = 0; i < psa->rgsabound[0].cElements; i++)
      ::SysFreeString(bstrArray[i]);

    ::SafeArrayDestroy(psa);
  }



で、以下はC#側の例です。

コード:
  // C# 側
  public void set_sequence(string[] stringArray)
  {
    foreach (string strValue in stringArray)
    {
      System.Windows.Forms.MessageBox.Show(strValue);
    }
  }



(あまりデバッグしていないので誤りがあったらご指摘を・・・)
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2004-10-17 21:27
chackさん、ありがとうございます。

引用:

コード:
  // VC++ 側
  SAFEARRAY* psa = ::SafeArrayCreateVector(VT_BSTR, 0, 3);





どうやらここが間違ってたようです。
VT_BSTRでなくてバリアント型で作成していたようで、ここをBSTR型に
変えたらうまくいくようになりました。

ありがとうございました。m(__)m
1

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