4

GetTickCount64 という名前の kernel32.dll ライブラリから外部関数を宣言したいと思います。私の知る限り、Vista とそれ以降の Windows バージョンでのみ定義されています。これは、関数を次のように定義すると、次のようになることを意味します。

function GetTickCount64: int64; external kernel32 name 'GetTickCount64';

アプリケーションの起動時にエラーが発生するため、以前のバージョンの Windows でアプリケーションを実行することはできません。

その問題の回避策はありますか? その関数が存在しない場合は含めず、コードで代替関数を使用したいとしましょう。どうやってするか?役立つコンパイラ ディレクティブはありますか? 定義はそのようなディレクティブで囲む必要があり、GetTickCount64 関数を使用する場合はどこでもいくつかのディレクティブを使用する必要があると思いますよね?

あなたの助けに感謝します。前もって感謝します。

マリウス。

4

1 に答える 1

12

その型の関数ポインターを宣言し、実行時にLoadLibraryorGetModuleHandleおよびを使用して関数を読み込みますGetProcAddress。Delphi のソース コードには、この手法の例がいくつかあります。古いバージョンの Windows NT では利用できないToolHelp ライブラリをロードするTlHelp32.pasを見てください。

interface

function GetTickCount64: Int64;

implementation

uses Windows, SysUtils;

type
   // Don't forget stdcall for API functions.
  TGetTickCount64 = function: Int64; stdcall;

var
  _GetTickCount64: TGetTickCount64;

// Load the Vista function if available, and call it.
// Raise EOSError if the function isn't available.
function GetTickCount64: Int64;
var
  kernel32: HModule;
begin
  if not Assigned(_GetTickCount64) then begin
    // Kernel32 is always loaded already, so use GetModuleHandle
    // instead of LoadLibrary
    kernel32 := GetModuleHandle('kernel32');
    if kernel32 = 0 then
      RaiseLastOSError;
    @_GetTickCount := GetProcAddress(kernel32, 'GetTickCount64');
    if not Assigned(_GetTickCount64) then
      RaiseLastOSError;
  end;
  Result := _GetTickCount64;
end;
于 2009-04-25T13:51:58.540 に答える