ページ 1 / 1
DLLにするとアクセス違反が起きる
Posted: 2006年4月03日(月) 21:40
by yu0627
こんばんは。yu0627です。
現在、ログファイルを記録するコードを製作しています。
しかし、そこで問題が発生しました。
作成したコードをインクルードして実行すると、うまくいくのですが、
DLLにすると、うまくいきません。呼び出し自体はうまくいっているんです。
インクルードしたファイルをDLLソースに貼り付けて「Export」をつけても同じです。
呼び出し側プログラムだけ載せます。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Sub FirstSetting Lib "addlogfunc"(lpszSoftName As BytePtr, lpszAutherName As BytePtr, hwnd As HWND)
Declare Function MakeLogFile Lib "addlogfunc"(lpszLogFilePath As BytePtr, cHRChar As *Char, nHRNum As Long) As Long
Declare Function OpenLogFile Lib "addlogfunc"(lpszLogFilePath As BytePtr, cHRChar As *Char, nHRNum As Long) As Long
Declare Sub AddLog Lib "addlogfunc"(lpszLog As BytePtr)
Declare Sub CloseLogFile Lib"addlogfunc"()
Dim lpstrLogFilePath[MAX_PATH-1] As Byte
lstrcpy(lpstrLogFilePath, "D:\My Documents\プログラミング\Source\addlogfunc\test.log")
FirstSetting("Test", "yu0627", 0)
If GetFileAttributes(lpstrLogFilePath)=-1 Then
If MakeLogFile(lpstrLogFilePath, "=", 60)=0 Then goto *End
Else
If OpenLogFile(lpstrLogFilePath, "-", 60)=0 Then goto *End
End If
AddLog("Test Start!")
AddLog("Ifcdjmdldf,nmdf,.cfmdj.;lgvjkgmd.;fmsxk;vjxdf,")
AddLog("cfjkld;fvmdf.;vjknsdoijf")
AddLog("Test End!")
CloseLogFile()
*End
ExitProcess(0)
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から呼び出すとおかしく
なることです。とりやえず、該当部分だけソースを公開します。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'グローバル変数
Dim lpszUsingSoftName As BytePtr 'DLLを使用するソフト名
Dim lpszUsingSoftAutherName As BytePtr 'DLLを使用するソフトの作者名
Dim hwndOwner As HWND '親ウインドウハンドル
Dim lpstrLogFileName[MAX_PATH] As Byte 'ログファイルのパス
Dim hFile As HFILE 'ログファイルのハンドル
Dim lpszLogBuffer As BytePtr 'ログファイルのバッファ
Dim dwSecureBufferSize As DWord '確保したバッファのサイズ
lpszLogBuffer=malloc(10^9*1)
dwSecureBufferSize=10^9*1
---略---
'ログファイル生成
Function Export MakeLogFile(lpszLogFilePath As BytePtr, cHRChar As *Char, nHRNum As Long) As Long
Dim i As Long
lstrcpy(lpstrLogFileName, lpszLogFilePath)
'ログファイルをオープン
hFile=CreateFile(lpstrLogFileName, GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE,
ByVal 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hwndOwner, "ログファイルハンドルの作成に失敗",
"Error - AddLogFunction", MB_OK or MB_ICONSTOP)
hFile=0
MakeLogFile=0
Exit Function
End If
wsprintf(lpszLogBuffer, Ex"%s LogFile\r\nCopyRight(C) %s, All Rights Reseved.\r\n\r\nLogFile Made By AddLogFunction\r\nCopyRight(C) yu0627, All Rights Reseved.\r\n",
lpszUsingSoftName, lpszUsingSoftAutherName)
i=1
For i=1 To nHRNum
lstrcat(lpszLogBuffer, cHRChar)
Next
lstrcat(lpszLogBuffer, Ex"\r\n")
MakeLogFile=1
End Function
Function Export OpenLogFile(lpszLogFilePath As BytePtr, cHRChar As *Char, nHRNum As Long) As Long
Dim dwFileSize As DWord 'ファイルサイズ
Dim dwAccessByte As DWord 'アクセスサイズ
Dim i As Long 'フラグ
lstrcpy(lpstrLogFileName, lpszLogFilePath)
'ログファイルをオープン
hFile=CreateFile(lpstrLogFileName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hFile=INVALID_HANDLE_VALUE Then
MessageBox(hwndOwner, "ログファイルのオープンに失敗", "Error - AddLogFunction", MB_OK or MB_ICONSTOP)
hFile=0
OpenLogFile=FALSE
Exit Function
End If
'ログファイルのバイト数を取得し、バッファを確保する
dwFileSize=GetFileSize(hFile, 0)
If dwFileSize>=dwSecureBufferSize Then
lpszLogBuffer=realloc(lpszLogBuffer, lstrlen(lpszLogBuffer)+10^9*1)
dwSecureBufferSize=lstrlen(lpszLogBuffer)+10^9*1
End If
'ログファイルの内容を読み込み、前のログとの区切り線を入れる
ReadFile(hFile, lpszLogBuffer, dwFileSize, VarPtr(dwAccessByte), ByVal 0)
i=1
For i=1 To nHRNum
lstrcat(lpszLogBuffer, cHRChar)
Next
lstrcat(lpszLogBuffer, Ex"\r\n")
'ファイルハンドルを開きなおす
CloseHandle(hFile)
hFile=CreateFile(lpstrLogFileName, GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
OpenLogFile=1
End Function
バッファも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ファイルと同じ感覚で使っていたのが問題でした。