VB2005からCで作成されたDLLをコールするには?

解決


粗茶  2007-09-28 21:10:57  No: 99495

はじめまして。粗茶と申します。

C++で作成された暗号化を行うDLLをVB2005からコールしたところ、
エラーが判定が返されて暗号化が行われない現象が出ています。
C++のサンプルコード(こちらは正常に動作)と比較しながら作成したつもりなのですが、
VB2005側のソースの13行目でエラー判定が返ってきてしまいます。
DLLの戻り値のエラーを確認したところ「このコマンドを実行するのに十分な記憶域がありません。」とのことでした。

取得される必要なバッファサイズはVB2005、C++共に同じ値が格納されています。
VB2005とC++の文字列型の違いにあるように思えますが、解決方法が見つかっていない状態です。
どなたか現象が解る方がいらっしゃれば、ご教授をお願い致します。

#########################################################################################
・VB2005
-----------------------------------------------------------------------------------------
  '暗号化
  Private Declare Function dllFncGetEncodeString Lib "Encode.dll" (
    ByVal strPlane As String, _
    ByRef strBuffer As String, _
    ByRef intBuffSize As Integer) As Integer
-----------------------------------------------------------------------------------------
 1  'バッファサイズ取得
 2  intBuffLen = modFncGetEncodeBufferSize(strPlaneString, strMsg)
 3  If intBuffLen < 0 Then
 4    '戻り値が0より小さければエラー
 5    strMsg = "バッファサイズの取得に失敗しました。(" + CStr(intBuffLen) + ")"
 6    GoTo Skip_Fnc
 7  End If
 8  
 9  'バッファ確保
10  strWrk = Space(intBuffLen)
11  
12  '暗号化開始
13  intRet = dllFncGetEncodeString(strPlaneString, strWrk, intBuffLen)
14  If intRet <> 0 Then
15    '戻り値が0以外ならエラー
16    strMsg = "暗号化に失敗しました。(" + CStr(intRet) + ")"
17    GoTo Skip_Fnc
18  End If
#########################################################################################

#########################################################################################
・C++
-----------------------------------------------------------------------------------------
  //暗号化
  DWORD __stdcall  dllFncGetEncodeString(
    PCTSTR  lpszPlane,    //平文
    PTSTR  lpszBuffer,    //暗号文を格納するバッファ
    DWORD  dwBuffSize);  //暗号文を格納するバッファ長(終端NULL文字を含んだ長さ)
-----------------------------------------------------------------------------------------
 1  //バッファサイズ取得
 2  dwBuffSize = ::dllFncGetEncodeLength((DWORD)strlen(LPCTSTR(m_strPlane)));
 3  
 4  //バッファ確保
 5  pszBuff = new CHAR [dwBuffSize];
 6  if (pszBuff == NULL) {
 7    AfxMessageBox(_T("メモリの獲得に失敗しました。"), MB_ICONSTOP);
 8    return;
 9  }
10  ::ZeroMemory(pszBuff, dwBuffSize);
11  
12  //暗号化
13  dwReturn = ::dllFncGetEncodeString(LPCTSTR(m_strPlane), pszBuff, dwBuffSize);
14  if (dwReturn != 0) {
15    CString  strMsg;
16    strMsg.Format(_T("暗号化に失敗しました。[%ld]"), dwReturn);
17    AfxMessageBox(LPCTSTR(strMsg), MB_ICONSTOP);
18    delete [] pszBuff;
19    return;
20  }
#########################################################################################

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


YuO  2007-09-28 21:49:03  No: 99496

ここはVB2 - VB6用の掲示板です。
VB 2005はVB.NET掲示板かVB初心者掲示板を利用しましょう。

本題ですが,いくつか問題点があります。
・文字列の変更があるのであれば,.NET側の型はStringBuilderでなければなりません。
・C++側ではTCHAR系とcharが混ざっていますが,どっちを使いたいのでしょうか。とりあえず,キャストは全部本来不要なはずです。
・C++側のlpszBuffが使われていない
・C++側のpszBuffが宣言されていない
・C++側のpszBuffに確保したメモリがリークする
・C++側のdwBuffSizeの型はDWORDなのに,ByRefで渡している
ぱっと見ただけでこれだけの問題点が挙がります。


粗茶  2007-09-28 22:06:19  No: 99497

YuO様

ご指摘ありがとうございます。
ソースもはしょりすぎてしまった様ですので詳細に記したものを、
VB初心者掲示板で改めてご質問させていただきます。


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

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






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