Win9x、NT、2000、XPの端末が混在する環境で使用するプログラムで、
Win2000、XPの端末だけコンピュータのロック機能を有効にしたいのですが、
procedure TForm1.Button1Click(Sender: TObject);
begin
LockWorkStation;
end;
というようなコーディングをすると、
このプログラムをWin9xやNTでプログラムを起動した場合、
エラー(NTの場合「エントリポイントが見つかりません」)が
表示され、使えません。
なお、Win2000以上でないとButton1を使用できないような
制限はかけています。
何か良い知恵はありませんでしょうか?
バージョンチェックして、LockWorkStationというAPIを動的にGetProcAdressしておけば良いかと。
早速のご回答ありがとうございます。
にしのさんがおっしゃるのはおそらくこういうことだと思うのですが、
Win9xでは「不正な処理」、NTでは「ワトソン博士」が起動時に表示されてしまいます。
function MyLockWorkStation: Boolean;
type
TLockWorkStation = function: Boolean;
var
h: HMODULE;
LockWorkStation: TLockWorkStation;
begin
Result := False;
h := GetModuleHandle('USER32.DLL');
if h <> 0 then
begin
@LockWorkStation := GetProcAddress(h, 'LockWorkStation');
if @LockWorkStation <> nil then
begin
LockWorkStation;
Result := True;
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
MyLockWorkStation;
end;
GetModuleHandleでなく、LoadLibraryを使ってみてください。
残念ながら、結果は先程と同じでした。
そのままコピーして使ってみましたがエラーは起きませんでした。
ただ、Win9xの環境がないため、VMware上でですが。
動的にLoadLibraryしているのであれば、少なくとも起動時にエラーが出るのはおかしいです。
他に原因があるのだと思います。
新規にプロジェクトを作成して試してみましたか?
> Win9xでは「不正な処理」、NTでは「ワトソン博士」が起動時に表示されてしまいます。
LockWorkStation は、2000/XP でしかつかえませんよ。
その他では実装されていませんから、呼び出した時点でエラーになります。
静的リンクもできません。
にしのさんの
> バージョンチェックして
は、papier さんはどのようにしてますか。また、2000/XP と判断したところで
LoadLibrary() GetProcAddress() FreeLibrary() を使います。
私もそのままコピーして試しましたが、エラーは起きません。
W2K(D6)でコンパイルしてW98(SE)とNT(SP6)で実行しました。
新規プロジェクトを作成して試してみたらうまくいきました。
(確認環境:Win95b、NT4SP6)
エラーが出る他の原因を考えてみます。
皆さんありがとうございました。
エラーが出る原因も突き止めました。取り急ぎご連絡まで。
ありがとうございました。
ツイート | ![]() |