まず、レジストリを使用してコンピュータ名を取得するのが間違っています。代わりにGetComputerName()
機能を使用する:あなたは正しく文字エンコーディングを処理していないので、
uses
Windows;
...
function GetCompName: string;
var
CompName: array[0..MAX_COMPUTERNAME_LENGTH] of Char;
Size: DWORD;
begin
Size := Length(CompName);
if GetComputerName(CompName, Size) then
SetString(Result, CompName, Size-1)
else
Result := '';
end;
第二に、あなたのFileWrite()
コードが失敗します。 FileWrite()
は生のバイトのみで動作しますが、Unicode文字列を使用していて、SizeOf(WideChar)
が2であることを考慮していないため、コードで想定されているように1ではありません。
また、RTLのFileCreate()
関数をFileWrite()
で使用する必要があります。 Win32 CreateFile()
関数を直接使用する場合は、Win32 API WriteFile()
も直接使用する必要があります。
ファイルの書き込み方法を問わず、相対パスではなくファイルへの絶対パスを使用する必要があります。上記のコードはUTF-16エンコーディングでファイルを作成すること
procedure TForm1.FormCreate(Sender: TObject);
var
FileName: string
hFile: THandle;
Str: string;
begin
FileName := 'C:\path to\test.txt';
if not FileExists(FileName) then
begin
Str := GetCompName;
hFile := FileCreate(FileName);
if hFile <> INVALID_HANDLE_VALUE then
begin
FileWrite(hFile, PChar(Str)^, Length(Str) * SizeOf(Char));
FileClose(hFile);
end;
end;
注:
このようなより多くのものを試してみてください。
procedure TForm1.FormCreate(Sender: TObject);
var
FileName: string;
hFile: THandle;
Str: UTF8String;
begin
FileName := 'C:\path to\test.txt';
if not FileExists(FileName) then
begin
Str := UTF8String(GetCompName);
hFile := FileCreate(FileName);
if hFile <> INVALID_HANDLE_VALUE then
begin
FileWrite(hFile, PAnsiChar(Str)^, Length(Str));
FileClose(hFile);
end;
end;
またはそのことについては、他のエンコーディング:
procedure TForm1.FormCreate(Sender: TObject);
var
FileName: string;
hFile: THandle;
Enc: TEncoding;
Str: TBytes;
begin
FileName := 'C:\path to\test.txt';
if not FileExists(FileName) then
begin
Enc := TEncoding.GetEncoding('desired encoding');
try
Str := Enc.GetBytes(GetCompName);
finally
Enc.Free;
end;
hFile := FileCreate(FileName);
if hFile <> INVALID_HANDLE_VALUE then
begin
FileWrite(hFile, PByte(Str)^, Length(Str));
FileClose(hFile);
end;
end;
あなたが使用することを決定どのようなエンコーディング、簡単な解決策でしょうあなたの代わりにUTF-8を使用したい場合は、次のようになります
uses
IOUtils;
procedure TForm1.FormCreate(Sender: TObject);
var
FileName: string;
begin
FileName := 'C:\path to\test.txt';
if not FileExists(FileName) then
begin
TFile.WriteAllText(FileName, GetCompName, TEncoding.UTF8); // or TEncoding.Unicode, etc...
end;
end;
使用するエンコード方法は? –