MASM のすぐ下にある C++ コードの動作を再現したい:
C++ コード:
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include <strsafe.h>
int _tmain(int ac, TCHAR **av)
{
HANDLE hFile;
WIN32_FIND_DATA findFileData;
BOOL retFindNextFile;
if ((hFile = FindFirstFile(TEXT("C:\\Users\\Bloodsucker94\\Desktop\\TestFolder\\*.txt"), &findFileData)) == INVALID_HANDLE_VALUE)
else {
do {
_tprintf(TEXT("%s\n"), findFileData.cFileName);
retFindNextFile = FindNextFile(hFile, &findFileData);
} while (retFindNextFile == TRUE);
}
getchar();
return (EXIT_SUCCESS);
}
そしてMASMコード:
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\masm32rt.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
include \masm32\include\msvcrt.inc
includelib \masm32\lib\msvcrt.lib
.data
FolderPath BYTE "C:\Users\Bloodsucker94\Desktop\TestASM\*.txt", 0
FindFirstFileError BYTE "FindFirstFile() failed with code %d", 0
FindFirstFileSuccess BYTE "First file found with success - hfile=%d", 0
PrintStructAddr BYTE "addr=Ox%08X", 0
PrintFileName BYTE "%s", 0
.data?
hFile HANDLE ?
findFileData WIN32_FIND_DATA <>
retFindNextFile BOOL ?
ErrorCode DWORD ?
.code
start:
;--------------------------------------------------------
invoke FindFirstFile, ADDR FolderPath, \
ADDR findFileData
mov hFile, eax
.IF hFile == INVALID_HANDLE_VALUE
invoke GetLastError
mov ErrorCode, eax
invoke crt_printf, ADDR FindFirstFileError, \
ErrorCode
jmp _quit
.ENDIF
;--------------------------------------------------------
mov ebx, OFFSET findFileData
mov al, [ebx].WIN32_FIND_DATA.cFileName
print str$(findFileData.cFileName)
;print str$([ebx].WIN32_FIND_DATA.cFileName)
;print str$(al)
;INVOKE crt_printf, ADDR PrintFileName, \
; findFileData.cFileName
;--------------------------------------------------------
_quit:
invoke ExitProcess, 0
end start
今のところ、ご覧のとおり、ディレクトリ「TestASM」の最初のファイル名を出力したいだけです。実行時に FindFirstFile() はうまく実行されているようで、hFile ハンドルも正しいようです。ただし、すべての印刷呼び出しでメッセージ ボックスにエラー メッセージが表示される理由がわかりません。セグメンテーション違反だと思います。しかし、私は C++ コードの動作を尊重しています。いくつかのコードの組み合わせを試しましたが無駄でした。
誰でも私を助けることができますか?