はじめまして。粗茶と申します。
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);
#########################################################################################
以上、宜しくお願い致します。
> 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文字を含んだ長さ)
魔界の仮面弁士 様
ご指摘ありがとうございます。
正しくその通りでした。初歩的なミスで申し訳ありませんでした。
ツイート | ![]() |