Visual C++ からIWshRuntimeLibraryを使用したイベントログ出力

VC++でもVBScriptの様に、Wscript.Shellを使ってイベントログを出力出来ると思い、調べてみた所、LogEvent関数というのが用意されていたので、それを使ってイベントログを出力しようとしましたが、うまく行きません。
ソース: http://d.hatena.ne.jp/neuromancer_sho/20110806/1312599469
wshom.tliのIWshShell2::LogEvent内で実行される、raw_LogEvent関数で エラー「0x800706ba RPC サーバーを利用できません。」が発生してしまいます。
その他のWscript.Shellの機能(get_CurrentDirectory, SpecialFoldersなど)を書いてみると、ちゃんと動作します。
何がダメなんでしょうか?

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2012/03/12 01:41:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:cx20 No.2

回答回数607ベストアンサー獲得回数108

ポイント300pt

LogEvent メソッドの使い方が誤っているような気がします。
第3引数を "Application" → "." に変更したところ、イベントログ出力することを確認しました。

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#undef GetFreeSpace
#define GetFreeSpace GetFreeSpaceEx
#import "wshom.ocx"
#include <locale>
#include "atlsafe.h"
#include "comutil.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR buf[1024];
    size_t num;
    HRESULT hr;
    
    CoInitialize(NULL); 
    setlocale(LC_ALL, "Japanese");

    IWshRuntimeLibrary::IWshShell3Ptr wshShell = NULL;
    hr = wshShell.CreateInstance("Wscript.Shell");
    
    CComVariant v = EVENTLOG_INFORMATION_TYPE;
    
    // objShell.LogEvent (種類), "(書き込む文字列)" , "(コンピュータ名)"
    hr = wshShell->LogEvent(&v, L"イベントです", L"."); 

    return 0;
}

<参考情報>
■ @IT:運用 Windows管理者のためのWindows Script Host入門 第7回 WshShellオブジェクトの詳細(3) 1.アプリケーション・イベント・ログの作成 ― LogEventメソッド ―
http://www.atmarkit.co.jp/fwin2k/operation/wsh07/wsh07_01.html

id:neuromancer_sho

ありがとうございます。解決しました。
_bstr_t Targetというのがイベントの種類だと思い込んでいました。コンピュータ名だったとは・・・

2012/03/12 01:39:14

その他の回答1件)

id:mario-16 No.1

回答回数219ベストアンサー獲得回数21

以下のサイトは参考になりますでしょうか。
http://www.lansweeper.com/kb/The-RPC-server-is-unavailable.aspx

0x80070005 のエラーが起きるかもしれません。その場合には以下の情報が役に立つと思います。
http://www.lansweeper.com/kb/WMI-Access-is-denied.aspx

id:cx20 No.2

回答回数607ベストアンサー獲得回数108ここでベストアンサー

ポイント300pt

LogEvent メソッドの使い方が誤っているような気がします。
第3引数を "Application" → "." に変更したところ、イベントログ出力することを確認しました。

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#undef GetFreeSpace
#define GetFreeSpace GetFreeSpaceEx
#import "wshom.ocx"
#include <locale>
#include "atlsafe.h"
#include "comutil.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR buf[1024];
    size_t num;
    HRESULT hr;
    
    CoInitialize(NULL); 
    setlocale(LC_ALL, "Japanese");

    IWshRuntimeLibrary::IWshShell3Ptr wshShell = NULL;
    hr = wshShell.CreateInstance("Wscript.Shell");
    
    CComVariant v = EVENTLOG_INFORMATION_TYPE;
    
    // objShell.LogEvent (種類), "(書き込む文字列)" , "(コンピュータ名)"
    hr = wshShell->LogEvent(&v, L"イベントです", L"."); 

    return 0;
}

<参考情報>
■ @IT:運用 Windows管理者のためのWindows Script Host入門 第7回 WshShellオブジェクトの詳細(3) 1.アプリケーション・イベント・ログの作成 ― LogEventメソッド ―
http://www.atmarkit.co.jp/fwin2k/operation/wsh07/wsh07_01.html

id:neuromancer_sho

ありがとうございます。解決しました。
_bstr_t Targetというのがイベントの種類だと思い込んでいました。コンピュータ名だったとは・・・

2012/03/12 01:39:14

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません