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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

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

#1 投稿記事 by yu0627 »

 こんばんは。yu0627です。
 現在、ログファイルを記録するコードを製作しています。
しかし、そこで問題が発生しました。
作成したコードをインクルードして実行すると、うまくいくのですが、
DLLにすると、うまくいきません。呼び出し自体はうまくいっているんです。
インクルードしたファイルをDLLソースに貼り付けて「Export」をつけても同じです。
呼び出し側プログラムだけ載せます。
DLLはこちらです。
(諸事情によりURLは除去いたしました。)
なにぶんデバッグしても情報の取得に失敗してしまいますので...。
最後に編集したユーザー yu0627 [ 2012年12月14日(金) 20:56 ], 累計 1 回
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

#2 投稿記事 by 7 »

たぶん書いてないと思うんですけど、DLL側でlstrcpy(lpString1,lpString2+"hoge")なんてコードを実行してませんか?
書いてないとは思うんですけどね。

DLL側のソースが明らかになっていないとyu0627さんが解決するしかないと思います。
とりあえず、MakeLogFile()とOpenLogFile()関数が引っかかるのでその辺りの処理がアクセス違反してないか調べてみてください。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#3 投稿記事 by yu0627 »

たぶん書いてないと思うんですけど、DLL側でlstrcpy(lpString1,lpString2+"hoge")なんてコードを実行してませんか?
書いてないとは思うんですけどね。
 それはしていません。
DLL側のソースが明らかになっていないとyu0627さんが解決するしかないと思います。
とりあえず、MakeLogFile()とOpenLogFile()関数が引っかかるのでその辺りの処理がアクセス違反してないか調べてみてください。
 ひとつおかしいのが、インクルードするとうまくいくのに、DLLから呼び出すとおかしく
なることです。とりやえず、該当部分だけソースを公開します。
バッファも10^9Byte=1MB取っていますので、OKなはずです。
DLLのデバッグもうまくいかない状態ですので、「?」です。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#4 投稿記事 by konisi »

蛇足ですが。

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

どう考えても取りすぎです。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#5 投稿記事 by yu0627 »

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

どう考えても取りすぎです。
 すみません。そのとおりです。
高校の入学前課題を見間違えていました(爆)。
ノッチ
記事: 82
登録日時: 2005年6月01日(水) 23:27
お住まい: 北海道札幌市

#6 投稿記事 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以外をコメントアウトして、徐々に
処理を追加していってどこでエラーがでるか確認して見て下さい。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#7 投稿記事 by イグトランス »

そんな間違いに嵌まらないように1000 * 1000や1000 ^ 2(1000でなく1024も可)などと書くというのはどうでしょう?
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#8 投稿記事 by yu0627 »

 皆さん、ありがとうございます。
 原因が分かりました。
 DLL内の関数でなく、DllMain以下にバッファ確保コードを乗せたのが問題でした。
いつものsbpファイルと同じ感覚で使っていたのが問題でした。
返信する