2009-04-25 6 views
4

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

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

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

この問題を回避する方法はありますか?その関数が存在しないときに関数をインクルードしないようにして、コード内で代替関数を使用したいとしましょう。どうやってするか?助けるコンパイラ指令がありますか? 私は定義がそのような指示に囲まれなければならないと思うし、私はGetTickCount64のfounctionを使用するときはいつも、いくつかの指示を使わなければならないだろうか?

あなたの助けが理解されるであろう。前もって感謝します。

マリウス。

答えて

11

その型の関数ポインタを宣言し、実行時にLoadLibraryまたはGetModuleHandleおよびGetProcAddressを使用して関数をロードします。このテクニックのいくつかの例は、Delphiソースコードで見つけることができます。 TlHelp32.pasを参照してください。これはToolHelp libraryをロードします。これは古いバージョンのWindows NTでは利用できません。

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; 
+0

ご回答ありがとうございます。私はそれが私が探していたものだと思う。 私は質問があります。私は次のように条件を変更したい: 割り当てられていない場合(_GetTickCount64) @ _GetTickCount64:= @ GetTickCount; これは間違いありませんか?ご覧のとおり、GetTickCount64が定義されていない場合、代わりに "Windows"モジュールで宣言されているGetTickCount関数を使用しました。私は_GetTickCount64変数にint64を返す関数を割り当てることができることを理解しています。それとも、外部機能だけでなければならないのでしょうか?私はまだstdcallのキーワードを知らない:-(。 –

+0

DWordをInt64に割り当てることはできますが、 "DWordを返す関数へのポインタ"を "Int64を返す関数へのポインタ"に割り当てることはできません。 GetTickCount64のシグネチャとそれにGetTickCountを呼び出します。実際の関数が見つからない場合は、*関数*へのポインタを_GetTickCount64に割り当てます。 –

関連する問題