C言語関係掲示板

過去ログ

No.355.Dllでのmallocの使用について

[戻る] [ホームページ]
No.2305

Dllでのmallocの使用について
投稿者---まご(2002/08/05 10:18:30)


初めて投稿します、まごです。よろしくお願いします。

ある構造体をDllへ渡してDll内の関数でmallocしてデータを格納し、
実行元の関数でDllで取得したデータを表示するというプログラムを作成
したんですが、構造体のメモリーを実行元の関数で開放する時にアドレス違反が
必ず起きます。
取得したデータへのアクセスには特に支障はないのですが、freeを行うと動作が
おかしくなるようです。

Dll内で取得するデータは文字列で不定長なためmallocしています。

過去にこのような経験をされた方いらっしゃったらアドバイスお願いします。

問題になっている構造体は下記
呼び出し元で「S_RESULT_TBL」をmallocしDll内で「stRetData」,「sRetFilePath」,「sRetData」をmallocしています。
OSはWindows2000Proです。

以上、よろしくお願いします。

// 結果データテーブル
typedef struct {
        int             iRetDataLen;            // 返信データ内容の長さ
        int             iRecFilePathSize;       // ヒットレコードファイルフルパスサイズ
        char    *sRetFilePath;          // ヒットレコードファイルフルパス
        int             iHitRecOffset;          // ヒットレコードオフセット値
        int             iHitRecLen;                     // ヒットレコードレングス
        char    *sRetData;                      // 返信データ内容
} S_RESULT_DATA_TBL;

// 結果テーブル
typedef struct {
        char    sProcessID[21];         // プロセスID
        int             iRetRecNo;                      // 返信開始レコード番号
        int             iFlg;
        int             iHitCnt;                        // ヒット件数
        int             iDataRetCnt;            // データ返信件数
        S_RESULT_DATA_TBL       **stRetData;            // 返信データ
} S_RESULT_TBL;



No.2322

Re:Dllでのmallocの使用について
投稿者---かずま(2002/08/06 20:43:30)


> ある構造体をDllへ渡してDll内の関数でmallocしてデータを格納し、
> 実行元の関数でDllで取得したデータを表示するというプログラムを作成
> したんですが、構造体のメモリーを実行元の関数で開放する時にアドレス違反が
> 必ず起きます。
> 取得したデータへのアクセスには特に支障はないのですが、freeを行うと動作が
> おかしくなるようです。

プロジェクトの設定で、C/C++ タブを選択し、カテゴリをコード生成にし、
使用するランタイムライブラリを見てください。
そこが、「マルチスレッド(DLL)」または「マルチスレッド(DLL、デバッグ)」
になっていますか。
それから、DLL と EXE で同じライブラリを指定していますか。

コマンドラインからやるときは、/MD または /MDd です。

malloc()、free() などは、共通の static 変数を使って、メモリ管理を行って
いるらしく、異なるライブラリで、malloc() と free() を実行しても、エラー
になるはずです。

DLL 内で malloc() したものは、DLL内で free() するようにすれば、
DLL と EXE で異なるライブラリを指定しても問題ないはずです。
そういう作り方のほうがきれいだと思います。

No.2327

Re:Dllでのmallocの使用について
投稿者---まご(2002/08/07 13:27:09)


>プロジェクトの設定で、C/C++ タブを選択し、カテゴリをコード生成にし、
>使用するランタイムライブラリを見てください。
>そこが、「マルチスレッド(DLL)」または「マルチスレッド(DLL、デバッグ)」
>になっていますか。
>それから、DLL と EXE で同じライブラリを指定していますか。
>
かずまさんありがとうございます。

「ランタイムライブラリ」の設定ですが、
呼び元が「マルチスレッド」、DLLが「マルチスレッド(DLL)」に設定していたため動作がおかしくなっていたようです。

両方とも「マルチスレッド(DLL)」にしたら正常に動作するようになりました。

VC++の設定関係はさっぱり理解できていませんので、思いもよりませんでした。
ありがとうございました。