はじめまして。 くじらと申します。
Delphiの勉強を始めたばかりなのですが、以前作ったスクリプトなどをDelphiで動かしたいのですが、どうすればいいのかさっぱりわかりません。
なにかヒントや参考になるサイトなどの情報を教えてください。
ちなみに動かしたいのは
・Set WshNetwork = WScript.CreateObject("WScript.Network")
・Set objComputer = GetObject("winmgmts:impersonationLevel=impersonate}!//" & strPCName)
・Set NICs = objComputer.ExecQuery("select * from Win32_NetworkAdapterConfiguration")
こんなスクリプトです。
おかしな質問かもしれませんが、よろしくお願いします。
とくに問題がないのであれば、WScriptやCScriptを直接ShellExecuteなどで起動してやるだけです。
Delphi側に値を返したい場合は、CreateProcessで終了時のコードを返すようにすればできると思います。
# 未確認
終了を待たないと問題が出るかもしれないので、CreateProcessやShellExecuteExで終了待ちしたほうがよいです。
また、Delphiのオブジェクトを操作したいのであれば、Delphi側にCOMを組み込んで、WSH側でCreateObjectして使います。
くじらです。
にしのさん、返信ありがとうございます。
ログオンスクリプトなのでフォームはいらないのですが、どうすればいいでしょうか?
単純にフォームにからんでいそうな定義を消すとエラーになってしまいます。
シロート質問で申し訳ないのですが、教えてください。
よろしくお願いします。
問題ないのなら、コンソールアプリケーションとして作ったらどうでしょうか?
"新規作成"から、"コンソールアプリケーション"を選びます。
すると、説明文つきのプロジェクトソースが作成されるので、
begin
end.
の間に、命令文を書きます。
命令文に使えるもの(関数)は基本的にGUIアプリケーションのときと基本的に同じです。
(Application変数などは使えません)
コンソールに内容を出力するには、WriteやReadの関数を使えばいいです。
すみません、読み違えていたみたいですね。
てっきり、「WSHスクリプトを、Delphiで作成したアプリケーションから実行するには」ってことだと思いました。
「WSHスクリプトで書かれたものを、Delphiに移植するには」ってことですね。
ちょっと調べてみます。
調べてみたところ、GetObjectにあたるDelphiの関数が見つかりませんでした。
CreateObjectは、CreateOleObjectがそれにあたるので移植可能ですが、GetObjectは無理そうです。
DelphiからWSHを呼び出し、WSHからその結果をDelphiに返す(ファイル経由が楽)というのが簡単です。
WSHに関するタイプライブラリを使ってActiveXコンポーネントを作成すればもしかしたらできるかもしれませんが、未確認です。
もしかしたら出来るかもしれません。
objComputer = GetObject("winmgmts:{impersonationLevel=impersonate}")
にあたるDelphiコードは、
Locator := CreateOleObject('WbemScripting.SWbemLocator');
Service := Locator.ConnectServer();
になります。
"!//コンピュータ名"がつくのなら、ConnectServerの引数に渡せばできそうです。
# 引数に関しては調べ切れませんでした
試しにドライブ一覧を出すスクリプトを、Delphiでコーディングする例を出そうと思ったのですが、一覧する部分(For each Disk in DiskSetの部分)がわかりませんでした。
一応、途中までのソースです。
procedure TForm1.Button1Click(Sender: TObject);
var
Locator: OleVariant;
Service: OleVariant;
DiskSet: OleVariant;
Disk: OleVariant;
i: integer;
Count: Integer;
e: Variant;
begin
Locator := CreateOleObject('WbemScripting.SWbemLocator');
Service := Locator.ConnectServer();
DiskSet := Service.ExecQuery('Select * From Win32_LogicalDisk Where DriveType=3');
Memo1.Lines.Add(IntToStr(VarArrayDimCount(DiskSet)));
Count := DiskSet.Count;
//e := DiskSet.GetQuery;
for i := 1 to Count do
begin
Disk := DiskSet.Data[i]; // ← ここが間違い
Memo1.Lines.Add('Drive ' + Disk.Name + ':');
end;
end;
以下は、WSHのソースです。
Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer()
Set DiskSet = Service.ExecQuery("Select * From Win32_LogicalDisk Where DriveType=3")
For Each Disk In DiskSet
WScript.Echo "Drive " + Disk.Name + ":"
Next
くじらです。ご連絡が遅れてしまいすいません。
たかみちえさん、にしのさん返信ありがとうございます。
たかみちえさんの
・コンソールアプリケーションを作成する
にしのさんの
・Locator := CreateOleObject('WbemScripting.SWbemLocator');
Service := Locator.ConnectServer();
(サンプルコードまでありがとうございます。WSHと見比べて参考にさせていただきます。)
このへん調べて頑張ってみます。
うまくいきましたら改めてご報告させていただきます。
またわからないところがありましたら、ご教授お願いします。