BSTRを使ったDLLの動作を確認するには?

解決


ITS  2007-01-25 01:19:21  No: 64271

VC++.NET(2003)の環境でDLLを作成し、VB6.0でその関数を実行してもらおう
と下記プログラムを作成しました。内容はVBのString型で文字列"ABC"を
入力した時には、"15"を返すというものです。
そのDLLの関数の動作確認をVC++.NETで行おうとしましたが、
コンパイル時の文字列の型エラーやリンクエラーでなかなか上手くいかず、
頭を抱えております。

VC++.NETでの動作確認用(DLL呼び出し側)のソースコードについて、
どのようにコーディングしたらよいのでしょうか?
もしくは、DLL作成用のソースコードに誤った点がありましたら、
ご指摘下さい。

int VCSAMPLE_API __stdcall SampleMain(BSTR n)
{
  int num;
  char tmp[10];

  ::ZeroMemory(tmp, 10);
  int i = WideCharToMultiByte(CP_ACP, 0, n, SysStringLen(n),
                              tmp, sizeof(tmp)-1, 0, 0);
  if(tmp == "ABC") {
      num = 15;
      return num;
  }
}

以上、宜しくお願い致します。


Blue  2007-01-25 01:24:24  No: 64272

相手がVB6.0であれば、BSTRではなく普通にLPCSTRで受けれます。
よって、

int WINAPI Test(LPCSTR text)
{
     if (strcmp(text, "ABC") != 0) // 文字列の比較は == じゃ出来ん。(ポインタの比較になるので)
         retrun 15;
     return -1; // ABCじゃなかったらどうなるのかわからんので適当。
}

で、VB側は

Private Declare Function Test Lib "XXX.dll" (ByVal text As String) As Long

で動くはず。


Blue  2007-01-25 01:26:12  No: 64273

間違えました。

>if (strcmp(text, "ABC") != 0) 
if (strcmp(text, "ABC") == 0) 

strcmpの戻り値が 0 のとき文字列が等しいのでした。


ITS  2007-01-25 01:58:10  No: 64274

上記、ご指摘通りLPCSTR型に修正したら解決できました。
Blueさん、ご回答ありがとうございました。


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

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






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