4

こんにちは、Delphi 2006 でこの関数を使用していましたが、D2010 ではエラーがスローされます。Unicode への切り替えに関連していると思います。

  Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
  Var
     Buffer: ARRAY [0 .. MAX_PATH] OF char;
  Begin
    Repeat
      GetTempPath(SizeOf(Buffer) - 1, Buffer);
      GetTempFileName(Buffer, '~~', 0, Buffer);
      Result := ChangeFileExt(Buffer, Extension);
    Until not FileExists(Result);
  End;

機能させるにはどうすればよいですか?

編集

ChangeFileExt が呼び出されると「アクセス違反」が発生します

4

4 に答える 4

7

Windows.Pas

function GetTempFileName(lpPathName, lpPrefixString: PWideChar;
  uUnique: UINT; lpTempFileName: PWideChar): UINT; stdcall;

function GetTempPath(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; stdcall;

SysUtils.Pas

function ChangeFileExt(const FileName, Extension: string): string;

これを試して

  Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
  Var
     Buffer: ARRAY [0 .. MAX_PATH] OF WideChar;
  Begin
    Repeat
      GetTempPath(Length(Buffer), Buffer);
      GetTempFileName(Buffer, '~~', 0, Buffer);
      Result := ChangeFileExt(Buffer, Extension);
    Until not FileExists(Result);
  End;

またはこれ

  Function GetTempFile(Const Extension: String): String;
  Var
     Buffer: String;
  Begin
      SetLength(Buffer,MAX_PATH);
    Repeat
      GetTempPath( MAX_PATH, PChar( Buffer) );
      GetTempFileName(PChar( Buffer), '~~', 0, PChar( Buffer));
      Result := ChangeFileExt(Buffer, Extension);
    Until not FileExists(Result);
  End;

Delphi の場合、Char 型と PChar 型はそれぞれ WideChar 型と PWideChar 型です。

データを char バッファーに返す Windows API を使用する場合、それらのバッファーをバイト配列または AnsiChar 配列として再宣言する必要があります。

これらの Windows API を呼び出してバッファを送信している場合、API にバッファの長さを伝えるときに sizeof 関数を使用していた場合。Windows widechar API はバイト数ではなく文字数を必要とするため、これらの呼び出しを Length 関数に変更する必要があります。

さよなら。

于 2009-09-14T11:00:55.430 に答える
0

Delphi 2009 では、Char は Unicode char です。この関数には、おそらく AnsiChar の配列が必要です。

ちょうどそれをチェックしました。GetTempFilename と GetTempPath の両方に PWideString が必要です。

エラーメッセージは何ですか?

于 2009-09-14T10:47:30.517 に答える
0

dwSize パラメーターおよび/または戻り値に関する各 API 関数の正確な期待についてドキュメントを確認することを常にお勧めします。

残念ながら、さまざまなケースがあるため、「すべての文字列関数が必要とする/文字数を返す」と言うだけでは正確ではなく、読者を散発的な無効なポインター AV の悪夢に陥らせる可能性があります。

  • ほとんどの API 関数は文字数を期待/返しますが、そうでないものもあります。
  • 終端のヌル文字をカウントするものもあれば、カウントしないものもあります。
  • 一部の関数は、nil ポインターが渡された場合と非 nil ポインターが渡された場合とで動作が異なります。
  • また、必要なバッファ サイズを示す方法がまったくない関数もあります。

これらはすべてドキュメントで簡単に見つけることができますが、読む必要があります。本当。何時間も節約できます。

于 2012-06-07T01:52:55.980 に答える
0

GetTempPathAおよびGetTempFileNameAの Ansi バージョンであるGetTempPathおよびを使用しGetTempFileNameます。これらは Delphi 2009 でも引き続き利用でき、Delphi 2009 ヘルプ ファイルにも記載されていますが、宣伝はされていません。

于 2010-03-27T09:19:12.030 に答える