基本的な 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;
    TCHAR               FilePathPattern[] = TEXT("C:\\Users\\Bloodsucker94\\Desktop\\TestASM\\*.txt");
    if ((hFile = FindFirstFile(FilePathPattern, &findFileData)) == INVALID_HANDLE_VALUE)
        _tprintf(TEXT("FindFirstFile() failed with code %d\n"), GetLastError());
    else {
        _tprintf(TEXT("hFile=%d, addr=0x%08X\n"), hFile, &findFileData);
        do {
            TCHAR       beginPath[] = TEXT("C:\\Users\\Bloodsucker94\\Desktop\\TestASM\\");
            lstrcat(beginPath, findFileData.cFileName);
            _tprintf(TEXT("%s\n"), beginPath);
            //printf("%s\n", beginPath);
            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
includelib                      \masm32\lib\crtdll.lib
_tprintf PROTO C :VARARG
.data
FolderPath                      TCHAR                       "C:\Users\Bloodsucker94\Desktop\TestASM\*.txt", 0
BeginFolderPath                 TCHAR                       "C:\Users\Bloodsucker94\Desktop\TestASM\", 0
FileName                        TCHAR                       "ta_mere.txt", 0
LstrcatFailed                   BYTE                        "lstrcat failed", 0
FormatPrintString               BYTE                        "%s\n", 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                       ?
FinalFilePath                   LPTSTR                      ?
.code
start:
    ;--------------------------------------------------------
    invoke  FindFirstFile,      ADDR FolderPath,            \
                                ADDR findFileData
    mov     hFile,              eax
    .IF hFile == INVALID_HANDLE_VALUE
        invoke  GetLastError
        mov     ErrorCode,      eax
        printf("%d\n", ErrorCode)
        jmp                     _quit                                
    .ENDIF
    ;--------------------------------------------------------
_loop:
    invoke  lstrcat,            ADDR BeginFolderPath,
                                ADDR findFileData.cFileName
    mov     FinalFilePath,      eax
    .IF FinalFilePath == NULL
        invoke  MessageBox,     NULL,                       \
                                ADDR LstrcatFailed,         \
                                ADDR LstrcatFailed,         \
                                MB_OK 
    .endif      
    ;invoke crt_printf,         ADDR FormatPrintString,     \
    ;                           findFileData.cFileName
    invoke  MessageBox,         NULL,                       \
                                ADDR FinalFilePath,         \
                                ADDR FinalFilePath,         \
                                MB_OK 
    ;--------------------------------------------------------
    invoke  FindNextFile,       hFile,                      \
                                ADDR findFileData       
    .IF eax == NULL
        jmp                     _quit
    .ELSE
        jmp                     _loop                       
    .ENDIF
    ;--------------------------------------------------------
_quit:
    invoke  ExitProcess,        0
end start
コンパイルは完全に機能します。lstrcat 関数も失敗しません。しかし、実行時にメッセージ ボックスに文字列 "-O@" が表示されます。_tprintf ではなく printf を使用して印刷する場合、c++ プログラムで同じ動作に気付きました (TCHAR Windows タイプの印刷は printf では機能しないため)。MessageBox 関数に問題があるか、TCHAR 型が適切でない可能性があります。C++ プログラムのみが機能します。道に迷いました。
誰でも私を助けることができますか?
よろしくお願いします。