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

解決


粗茶  2007-09-28 23:16:16  No: 137639

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

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

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

#########################################################################################
・VB2005
-----------------------------------------------------------------------------------------
  '暗号化
  Private Declare Function dllFncGetEncodeString Lib "Encode.dll" (
    ByVal strPlane As String, _                                                    
    ByRef strBuffer As System.Text.StringBuilder, _                                                        
    ByRef intBuffSize As Integer) As Integer
  ※変更される筈のない intBuffSize を ByVal で定義すると
  「保護されているメモリに読み取りまたは書き込み操作を行うとしました。他のメモリが壊れていることが考えられます。」
  というエラーが出力されます
-----------------------------------------------------------------------------------------
 1  Public Function modFncStringEncode(ByVal strPlaneString As String, _
 2    ByRef strReturn As String, _
 3    Optional ByRef strMsg As String = "") As Boolean
 4
 5    Dim blnRet As Boolean
 6    Dim intRet As Integer
 7    Dim intBuffLen As Integer
 8    Dim strWrk As New System.Text.StringBuilder
 9
10    blnRet = False
11
12    Try
13
14    'バッファサイズ取得
15    intBuffLen = modFncGetEncodeBufferSize(strPlaneString, strMsg)
16    If intBuffLen < 0 Then
17      '戻り値が0より小さければエラー
18      strMsg = "バッファサイズの取得に失敗しました。(" + CStr(intBuffLen) + ")"
19      GoTo Skip_Fnc
20    End If
21
22    'バッファ確保
23    strWrk.Append(Space(intBuffLen))
24    strWrk.Capacity = intBuffLen
25
26    '暗号化開始
27    intRet = dllFncGetEncodeString(strPlaneString, strWrk, intBuffLen)
28    If intRet <> 0 Then
29      '戻り値が0以外ならエラー
30      strMsg = "暗号化に失敗しました。(" + CStr(intRet) + ")"
31      GoTo Skip_Fnc
32    End If
33
34    Debug.Print( _
35      "===============================================================" + vbCrLf + _
36      "文字列長:" + CStr(strPlaneString.Length) + " / バッファサイズ:" + CStr(intBuffLen) + vbCrLf + _
37      "[" + strPlaneString + "] → [" + strWrk.ToString + "]" + vbCrLf + _
38      "===============================================================" _
39    )
40
41    strReturn = strWrk.ToString
42    blnRet = True
43
44    Catch Err As System.DllNotFoundException
45      'DLLが見つからなかった場合
46      strMsg = GC_YSRVCYTP_NOTFOUND
47    Catch ex As Exception
48      'エラー処理
49      strMsg = ex.Message
50    End Try
51
52  Skip_Fnc:
53
54    Return blnRet
55
56  End Function
#########################################################################################

#########################################################################################
・C++(こちらは正常に動作)
-----------------------------------------------------------------------------------------
  //暗号化
  DWORD __stdcall  dllFncGetEncodeString(
    PCTSTR  lpszPlane,    //平文
    PTSTR  lpszBuffer,    //暗号文を格納するバッファ
    DWORD  dwBuffSize);  //暗号文を格納するバッファ長(終端NULL文字を含んだ長さ)
-----------------------------------------------------------------------------------------
 1  CEdit*  pEdit = (CEdit*)GetDlgItem(IDC_ED_PLANE);
 2
 3  UpdateData(TRUE);
 4  if (m_strPlane.IsEmpty()) {
 5    AfxMessageBox(_T("平文を入力してください。"), MB_ICONEXCLAMATION);
 6    pEdit->SetFocus();
 7    return;
 8  }
 9  
10  DWORD  dwReturn;
11  DWORD  dwBuffSize;
12  CHAR*  pszBuff;
13  
14  //バッファサイズ取得
15  dwBuffSize = ::dllFncGetEncodeLength((DWORD)strlen(LPCTSTR(m_strPlane)));
16
17  //バッファ確保
18  pszBuff = new CHAR [dwBuffSize];
19  if (pszBuff == NULL) {
20    AfxMessageBox(_T("メモリの獲得に失敗しました。"), MB_ICONSTOP);
21    return;
22  }
23  ::ZeroMemory(pszBuff, dwBuffSize);
24
25  //暗号化
26  dwReturn = ::dllFncGetEncodeString(LPCTSTR(m_strPlane), pszBuff, dwBuffSize);
27  if (dwReturn != 0) {
28    CString  strMsg;
29    strMsg.Format(_T("暗号化に失敗しました。[%ld]"), dwReturn);
30    AfxMessageBox(LPCTSTR(strMsg), MB_ICONSTOP);
31    delete [] pszBuff;
32    return;
33  }
34  m_strCrypt = pszBuff;
35  delete [] pszBuff;
36  UpdateData(FALSE);
#########################################################################################

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


魔界の仮面弁士  2007-09-28 23:26:42  No: 137640

> Private Declare Function dllFncGetEncodeString Lib "Encode.dll" (
>    ByVal strPlane As String, _
>    ByRef strBuffer As System.Text.StringBuilder, _
>    ByRef intBuffSize As Integer) As Integer

第2引数は、ByVal StringBuilder なのでは?

> DWORD __stdcall dllFncGetEncodeString(
>    PCTSTR lpszPlane, //平文
>    PTSTR lpszBuffer, //暗号文を格納するバッファ
>    DWORD dwBuffSize); //暗号文を格納するバッファ長(終端NULL文字を含んだ長さ)


粗茶  2007-09-28 23:47:26  No: 137641

魔界の仮面弁士  様

ご指摘ありがとうございます。
正しくその通りでした。初歩的なミスで申し訳ありませんでした。


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

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






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