Win他バージョンが混在する環境でWin2000/XPだけでコンピュータのロックを使うには?

解決


papier  2004-02-23 21:28:51  No: 7302  IP: [192.*.*.*]

Win9x、NT、2000、XPの端末が混在する環境で使用するプログラムで、
Win2000、XPの端末だけコンピュータのロック機能を有効にしたいのですが、

procedure TForm1.Button1Click(Sender: TObject);
begin
  LockWorkStation;
end;

というようなコーディングをすると、
このプログラムをWin9xやNTでプログラムを起動した場合、
エラー(NTの場合「エントリポイントが見つかりません」)が
表示され、使えません。
なお、Win2000以上でないとButton1を使用できないような
制限はかけています。

何か良い知恵はありませんでしょうか?

編集    削除
にしの  2004-02-23 21:52:55  No: 7303  IP: [192.*.*.*]

バージョンチェックして、LockWorkStationというAPIを動的にGetProcAdressしておけば良いかと。

編集    削除
papier  2004-02-24 02:07:48  No: 7304  IP: [192.*.*.*]

早速のご回答ありがとうございます。
にしのさんがおっしゃるのはおそらくこういうことだと思うのですが、
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;

編集    削除
にしの  2004-02-24 03:12:06  No: 7305  IP: [192.*.*.*]

GetModuleHandleでなく、LoadLibraryを使ってみてください。

編集    削除
papier  2004-02-24 04:18:38  No: 7306  IP: [192.*.*.*]

残念ながら、結果は先程と同じでした。

編集    削除
にしの  2004-02-24 05:33:26  No: 7307  IP: [192.*.*.*]

そのままコピーして使ってみましたがエラーは起きませんでした。
ただ、Win9xの環境がないため、VMware上でですが。

動的にLoadLibraryしているのであれば、少なくとも起動時にエラーが出るのはおかしいです。
他に原因があるのだと思います。
新規にプロジェクトを作成して試してみましたか?

編集    削除
jok  2004-02-24 05:36:53  No: 7308  IP: [192.*.*.*]

> Win9xでは「不正な処理」、NTでは「ワトソン博士」が起動時に表示されてしまいます。

LockWorkStation は、2000/XP でしかつかえませんよ。
その他では実装されていませんから、呼び出した時点でエラーになります。
静的リンクもできません。

にしのさんの
> バージョンチェックして

は、papier さんはどのようにしてますか。また、2000/XP と判断したところで
LoadLibrary() GetProcAddress() FreeLibrary() を使います。

編集    削除
通りすがり  2004-02-24 17:40:14  No: 7309  IP: [192.*.*.*]

私もそのままコピーして試しましたが、エラーは起きません。
W2K(D6)でコンパイルしてW98(SE)とNT(SP6)で実行しました。

編集    削除
papier  2004-02-24 19:06:40  No: 7310  IP: [192.*.*.*]

新規プロジェクトを作成して試してみたらうまくいきました。
(確認環境:Win95b、NT4SP6)
エラーが出る他の原因を考えてみます。
皆さんありがとうございました。

編集    削除
papier  2004-02-24 19:28:34  No: 7311  IP: [192.*.*.*]

エラーが出る原因も突き止めました。取り急ぎご連絡まで。
ありがとうございました。

編集    削除