はじめまして。粗茶と申します。
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 }
#########################################################################################
以上、宜しくお願い致します。
ここはVB2 - VB6用の掲示板です。
VB 2005はVB.NET掲示板かVB初心者掲示板を利用しましょう。
本題ですが,いくつか問題点があります。
・文字列の変更があるのであれば,.NET側の型はStringBuilderでなければなりません。
・C++側ではTCHAR系とcharが混ざっていますが,どっちを使いたいのでしょうか。とりあえず,キャストは全部本来不要なはずです。
・C++側のlpszBuffが使われていない
・C++側のpszBuffが宣言されていない
・C++側のpszBuffに確保したメモリがリークする
・C++側のdwBuffSizeの型はDWORDなのに,ByRefで渡している
ぱっと見ただけでこれだけの問題点が挙がります。
YuO様
ご指摘ありがとうございます。
ソースもはしょりすぎてしまった様ですので詳細に記したものを、
VB初心者掲示板で改めてご質問させていただきます。
ツイート | ![]() |