ページ 11

DLLにするとアクセス違反が起きる

Posted: 2006年4月03日(月) 21:40
by yu0627
 こんばんは。yu0627です。
 現在、ログファイルを記録するコードを製作しています。
しかし、そこで問題が発生しました。
作成したコードをインクルードして実行すると、うまくいくのですが、
DLLにすると、うまくいきません。呼び出し自体はうまくいっているんです。
インクルードしたファイルをDLLソースに貼り付けて「Export」をつけても同じです。
呼び出し側プログラムだけ載せます。
DLLはこちらです。
(諸事情によりURLは除去いたしました。)
なにぶんデバッグしても情報の取得に失敗してしまいますので...。

Posted: 2006年4月04日(火) 10:03
by 7
たぶん書いてないと思うんですけど、DLL側でlstrcpy(lpString1,lpString2+"hoge")なんてコードを実行してませんか?
書いてないとは思うんですけどね。

DLL側のソースが明らかになっていないとyu0627さんが解決するしかないと思います。
とりあえず、MakeLogFile()とOpenLogFile()関数が引っかかるのでその辺りの処理がアクセス違反してないか調べてみてください。

返信@yu0627

Posted: 2006年4月04日(火) 21:06
by yu0627
たぶん書いてないと思うんですけど、DLL側でlstrcpy(lpString1,lpString2+"hoge")なんてコードを実行してませんか?
書いてないとは思うんですけどね。
 それはしていません。
DLL側のソースが明らかになっていないとyu0627さんが解決するしかないと思います。
とりあえず、MakeLogFile()とOpenLogFile()関数が引っかかるのでその辺りの処理がアクセス違反してないか調べてみてください。
 ひとつおかしいのが、インクルードするとうまくいくのに、DLLから呼び出すとおかしく
なることです。とりやえず、該当部分だけソースを公開します。
バッファも10^9Byte=1MB取っていますので、OKなはずです。
DLLのデバッグもうまくいかない状態ですので、「?」です。

Posted: 2006年4月04日(火) 21:12
by konisi
蛇足ですが。

1MB=1024KB=1048576Byte≒10^7*1.05 Byte
10^9Byte=976562.5KB≒953.674316MB≒0.931322575GB≒0.9GB

どう考えても取りすぎです。

返信@yu0627

Posted: 2006年4月04日(火) 22:02
by yu0627
1MB=1024KB=1048576Byte≒10^7*1.05 Byte
10^9Byte=976562.5KB≒953.674316MB≒0.931322575GB≒0.9GB

どう考えても取りすぎです。
 すみません。そのとおりです。
高校の入学前課題を見間違えていました(爆)。

Posted: 2006年4月04日(火) 22:11
by ノッチ
> 蛇足ですが。
>
> 1MB=1024KB=1048576Byte≒10^7*1.05 Byte
> 10^9Byte=976562.5KB≒953.674316MB≒0.931322575GB≒0.9GB
>
> どう考えても取りすぎです。

確かに1MByteを表現するには、10^6 もしくは 2^20 となります。
で、
インクルードするとうまくいくのに
というのは、DLLで呼び出している関数をEXEにコピーして実行すると、という
ことですよね?
まずは、EXEでエラーが発生しているのか、DLLでエラーが発生しているのか
を突き止めるのが良いかと。
アクセス違反は現状EXEで出ていますが、原因はDLL側っぽいです。
DLLでバッファの確保は成功しているか。msgboxやdebug等で確認。
関数に渡すパラメータは間違っていないか。最初のlstrcpyの引数をこれまた
msgboxやdebugで確認。
関数がエラーを返した時にGetLastErrorでエラーコードを取得後FormatMessageで
エラーの詳細を見る。等で確認して見て下さい。
それでもまだわからない時はlstrcpy以外をコメントアウトして、徐々に
処理を追加していってどこでエラーがでるか確認して見て下さい。

Posted: 2006年4月04日(火) 22:12
by イグトランス
そんな間違いに嵌まらないように1000 * 1000や1000 ^ 2(1000でなく1024も可)などと書くというのはどうでしょう?

返信@yu0627

Posted: 2006年4月04日(火) 22:37
by yu0627
 皆さん、ありがとうございます。
 原因が分かりました。
 DLL内の関数でなく、DllMain以下にバッファ確保コードを乗せたのが問題でした。
いつものsbpファイルと同じ感覚で使っていたのが問題でした。