はじめまして。DLLについてお聞きしたいことがあります。
【構成】
呼び出し元.exe (WinXP, VC++6.0 コンソールアプリ(MFCを使用)で作成)
作成したDLL
【現象】
このDLL関数を呼び出し元.exeから呼び出すとデバック環境で、
以下のようなエラーが出てしまう。
Debug Assertion Failed!
File:dbgheap.c
Line:1044
Expression:_CrtIsValidHeapPointer( pUserData )
【DLLについて】
MFC AppWizard(dll) MFCのスタティックライブラリを使用。
以下DLLのソースです。(エラー処理など一部省略しています。)
extern C __declspec(dllexport) BOOL FTPPutFile(
CString sIpAddr, // サーバのアドレス
CString sUsr, // サーバにログイン
するユーザ名
CString sPasswd, // サーバにログイン
するパスワード。
CString sLocalFile,// 送信するファイ
ルパス。
CString sRemoteFile,// 送信先のリモー
トファイルパス。
DWORD FtpMode // 転送モード。
)
{
CString s;
// FTP接続。
CInternetSession intesession
(NULL,0,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,INTERNET_FLAG_RELOAD |
INTERNET_FLAG_DONTCACHE ) ;
CFtpConnection* pFtpConnection;
TRY
{
pFtpConnection = intesession.GetFtpConnection( sIpAddr, sUsr, sPasswd,
INTERNET_DEFAULT_FTP_PORT , FALSE ) ;
}
CATCH( CInternetException , e )
{
e->GetErrorMessage( s.GetBuffer( 1024 ), 1024, NULL ) ;
s.ReleaseBuffer( -1 );
e->Delete() ;
return FALSE ;
}
END_CATCH ;
// ファイル送信。
pFtpConnection->PutFile( sLocalFile, sRemoteFile, FtpMode, 1 ) ;
// FTP切断。
pFtpConnection->Close() ;
intesession.Close() ;
}
このようなエラーが出てしまう原因としてどのようなものがあるのでしょうか?
お手数ですが、なにかヒント等教えていただけたら幸いです。
実際に
>File:dbgheap.c
>Line:1044
の部分を見ればわかりますが、無効な領域を開放しようとしています。
多分 e->Delete が原因かも。
MFCマクロのTRY~CATCHではDelete呼び出しは不要です。
あと引数にCString使ってますけど
EXE側とDLL側でCStringの実装が同じでないと(MFCバージョンが違うと)
不具合が起きる可能性があります。
>多分 e->Delete が原因かも。
>MFCマクロのTRY~CATCHではDelete呼び出しは不要です。
e->Deleteの部分を削除してもダメでした。
>あと引数にCString使ってますけど
>EXE側とDLL側でCStringの実装が同じでないと(MFCバージョンが違うと)
>不具合が起きる可能性があります。
CString型をCHAR*型にして試してみたのですが、
こちらは成功しました。
MFCのバージョンが異なっているのかもしれませんね。
ありがとうございます。