哪位大神能帮小弟我把以下代码在UNICODE环境下编译通过

哪位大神能帮我把以下代码在UNICODE环境下编译通过?
void CMakeSD::WritePasscode()
{
int file_attr = FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM;



TCHAR lpVolumeNameBuffer[MAX_SIZE];
DWORD lpVolumeSerialNumber;
DWORD lpMaximumComponentLength;
DWORD lpFileSystemFlags;
TCHAR lpFileSystemNameBuffer[MAX_SIZE];
TCHAR serial[MAX_SIZE];
TCHAR buf[BLOCK_SIZE];


GetVolumeInformation(szDrive,
lpVolumeNameBuffer,
sizeof(lpVolumeNameBuffer),
&lpVolumeSerialNumber,
&lpMaximumComponentLength,
&lpFileSystemFlags,
lpFileSystemNameBuffer,
sizeof(lpFileSystemNameBuffer));

//printf("盘的卷标:%s\n ",lpVolumeNameBuffer); //显示卷标
//printf("硬盘系列号:%08x\n",lpVolumeSerialNumber);//8位十六进制显示系列号

_stprintf(serial,_T("%08x"),lpVolumeSerialNumber);

CString szSerial(serial);

CString szName=_T("passcode");
int fd;

if ((fd = _open(szName,_O_CREAT | _O_BINARY | _O_WRONLY,_S_IWRITE))==0)
{
return ;
}
srand( (unsigned)time( NULL ) );

for (int i=0;i<BLOCK_SIZE;i++)
{
buf[i]=(TCHAR)(rand()&0xff);
}

CString szTemp(szSerial);

szTemp.Delete(4,szTemp.GetLength()-4);

memcpy(buf+0x48,szTemp,4);

szTemp=szSerial;

szTemp.Delete(0,4);

memcpy(buf+0x4dd,szTemp,4);

_write(fd,buf,sizeof(buf));

_close(fd);

}


------解决思路----------------------
簡單的修改辦法是將 _open 修改為 _topen,如果有問題,需要包含 <tchar.h>。這樣的話寫入的文件也將是 Unicode 編碼了。
------解决思路----------------------

#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>


#define MAX_SIZE (0x100)
#define BLOCK_SIZE (0x100)
#define szDrive _T( "C:\\" )
void WritePasscode()
{
    int file_attr = FILE_ATTRIBUTE_READONLY
------解决思路----------------------
FILE_ATTRIBUTE_HIDDEN
------解决思路----------------------
FILE_ATTRIBUTE_SYSTEM;
 
     
     
    TCHAR lpVolumeNameBuffer[MAX_SIZE];
    DWORD lpVolumeSerialNumber;
    DWORD lpMaximumComponentLength;
    DWORD lpFileSystemFlags;
    TCHAR lpFileSystemNameBuffer[MAX_SIZE];
    TCHAR serial[MAX_SIZE];
    TCHAR buf[BLOCK_SIZE];
     
 
    GetVolumeInformation(szDrive,
            lpVolumeNameBuffer,
            sizeof(lpVolumeNameBuffer),
            &lpVolumeSerialNumber,
            &lpMaximumComponentLength,
            &lpFileSystemFlags,
            lpFileSystemNameBuffer,
            sizeof(lpFileSystemNameBuffer));
 
    //printf("盘的卷标:%s\n ",lpVolumeNameBuffer); //显示卷标
    //printf("硬盘系列号:%08x\n",lpVolumeSerialNumber);//8位十六进制显示系列号
 
    _stprintf(serial,_T("%08x"),lpVolumeSerialNumber);
 
    CString szSerial(serial);
 
    CString szName=_T("passcode");
    int fd;
 
    if ((fd = _topen(szName,_O_CREAT 
------解决思路----------------------
 _O_BINARY 
------解决思路----------------------
 _O_WRONLY,_S_IWRITE))==0)
    {
        return ;
    }
    srand( (unsigned)time( NULL ) );
 
    for (int i=0;i<BLOCK_SIZE;i++)
    {
        buf[i]=(TCHAR)(rand()&0xff);
    }
 
    CString szTemp(szSerial);
 
    szTemp.Delete(4,szTemp.GetLength()-4);
     
    memcpy(buf+0x48,szTemp,4);
 
    szTemp=szSerial;
 
    szTemp.Delete(0,4);
 
    memcpy(buf+0x4dd,szTemp,4);
 
    _write(fd,buf,sizeof(buf));
 
    _close(fd);
 
}