Japan*
クイック ナビ|ホーム|各国のサイト
MSDN*
マイクロソフト サイトの検索:
Windows Live ID
ホーム 検索 マイ スレッド メンバ一覧 トップ回答者 FAQ  
.NET Framework 全般
EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する

スレッド開始者:blanca57move   開始日時:06 10 2008 5:15 午前 UTC   返信数:6
スレッド情報
最新の回答 : 今日、7:36 午前 UTC
参照回数 : 533
有用な投稿 : 0
状態: 未回答
 MSDN フォーラム » .NET Framework » .NET Framework 全般 » EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
RSS の取得RSS の取得
      « 前のスレッド   次のスレッド »
  06 10 2008, 5:15 午前 UTC
blanca57move
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。


投稿数2
EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
質問 この投稿は参考になりましたか?
返信 引用

-




blanca

   誹謗中傷の報告  
  07 10 2008, 3:41 午後 UTC
k_kazu
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。


投稿数34
Re: EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
コメント この投稿は参考になりましたか?
返信 引用

 

>必要なレジストリ情報またはメッセージを表示する

> メッセージ DLL ファイルがローカル コンピュータに

> 存在しない可能性があります

 

と書いてあるとおりです。

 

もう少し詳しく説明すると、イベントログは、表示するコンピュータの言語に合わせて内容が自動的に翻訳(ローカライズ)されて

表示できるように 、メッセージ部分は DLL の中にリソースとして含まれています。

 

イベントログを出力するプログラムは、アプリケーションをインストール時にそのメッセージDLLを一緒にインストールし、レジストリも設定します。

 

上記では、他のコンピュータにあるイベントログを表示しようとしているため、メッセージ内容が含まれたDLLが見つからないために正しく文字が表示されないようになっているのだと思います。

 

それぞれ変換に失敗するエントリのローカライズDLLをレジストリ

 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\{アプリケーション名}

 

から調べてみてはいかがでしょうか?

 

未検証ですが、

http://msdn.microsoft.com/en-us/library/bb427356(VS.85).aspx

を参考に

DLL を LoadLibray して FormatMessage すればメッセージが取得できるようなので、

PInvoke を使って 文字列の生成は可能かもしれません。

 

注:

 最初の投稿では、イベントログの キー名を間違えていたので修正しました。

 

 


   誹謗中傷の報告  
  昨日、5:41 午前 UTC
blanca57move
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。


投稿数2
Re: EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
コメント この投稿は参考になりましたか?
返信 引用

-




blanca

   誹謗中傷の報告  
  昨日、9:23 午前 UTC
k_kazu
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。


投稿数34
Re: EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
コメント この投稿は参考になりましたか?
返信 引用

ちょっと検証してみました。

 

まず C++ での検証ですが、

参考URL に記載されているコードは DLL 名を レジストリにあるとおりに変更したら動作しました。

CodeProject に 参考になる ソースをみつけました。

http://www.codeproject.com/KB/system/sysevent.aspx

 

しかし、Vista の イベントログ のレジストリには DLL 名ではなく ProviderGuid の定義がある物があり、

ETWトレース 形式のログで・・ これに関しては FormatMessage だけでは 対応できません。

 

次に C# で InteropService で呼び出したのですが、今一歩のところで うまくいきませんでした。

FormatMessage に渡す Argments に イベントログの ReplacementStrings を渡す必要があるのですが、

 va_list *  形式に変換する方法がわかりませんでした。

これされできれば DLL からイベントログ出力は可能です。

 

Code Snippet

using System.Runtime.InteropServices;


 

[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllName);

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
static extern uint FormatMessage(uint dwFlags, IntPtr lpSource,
   uint dwMessageId, uint dwLanguageId, [Out] StringBuilder lpBuffer,
   uint nSize, IntPtr Arguments);

uint MAKELANGID(uint p, uint s)
{
    return (s << 10) | p;
}

const uint LANG_JAPANESE = 0x11;
const uint SUBLANG_DEFAULT = 0x01;    // user default

const int LANG_ENGLISH = 0x09;
const int SUBLANG_ENGLISH_US = 0x01;

const uint FORMAT_MESSAGE_FROM_HMODULE = 0x00000800;
const uint FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
const uint FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
const uint FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;
const uint FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000;

private void button3_Click(object sender, EventArgs e)
{
    string msiDLL = @"C:\Windows\system32\msimsg.dll";
    IntPtr hMsiDLL = LoadLibrary(msiDLL);

    StringBuilder message = new StringBuilder(512);
    IntPtr lpMsgBuf = IntPtr.Zero;

    FormatMessage(
      FORMAT_MESSAGE_FROM_HMODULE,
      hMsiDLL,
      (uint)1033,
        //0,
        MAKELANGID(LANG_JAPANESE,SUBLANG_DEFAULT),
        //MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
      message,
      (uint)message.Capacity,
      IntPtr.Zero);

    Console.WriteLine(message.ToString());
}

 

 

今回の質問の直接の解決策ではありませんが、

 .NET Framework 3.5 では ETW にも対応した

System.Diagnostics.Eventing.Reader 名前空間の EventLogRecord クラスがあるので

.NET Framework 3.5 の環境を利用できるのであれば、そちらを使った方が簡単にイベントログメッセージが取得できます。

 

 


   誹謗中傷の報告  
  昨日、12:13 午後 UTC
blanca57move
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。


投稿数2
Re: EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
コメント この投稿は参考になりましたか?
返信 引用

-




blanca

   誹謗中傷の報告  
  今日、2:56 午前 UTC
Jitta
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。
MVP


投稿数101
Re: EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
コメント この投稿は参考になりましたか?
返信 引用

イベントログを取得する対象ホストが指定されているようです。

対象ホストと、アプリケーションの実行ホストが違うのでしょうか?

その場合、実行ホストにそのイベントを出力するアプリケーションをインストールすればよいと思われます。




Jitta@わんくま同盟

   誹謗中傷の報告  
  今日、7:36 午前 UTC
Jitta
これらの星は、フォーラムの参加状況を示します。さまざまなレベルの星やポイントの取得方法については、「よく寄せられる質問 (FAQ)」を参照してください。
MVP


投稿数101
Re: EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する
コメント この投稿は参考になりましたか?
返信 引用

再現しました。

「リモート ホストから取得」すると、ダメのようです。「ローカルから取得」するためには、GetEventLogs の引数なしバージョンを使用します。

コンピュータの管理で、リモート ホストから取得した場合についてどうなるかは、試せていません。コンピュータの管理で、ローカルにインストール済みのアプリケーションからのメッセージは解決できるなら、同じように解決してほしいところです。できないのなら、「仕様」で仕方がないと思います。




Jitta@わんくま同盟

   誹謗中傷の報告  
 ページ 1/1 (7 項目)
MSDN フォーラム » .NET Framework » .NET Framework 全般 » EventLog.GetEventLogsで取得した Entries の Message(説明)変換で失敗する

RSS の取得RSS の取得

© 2008 Microsoft Corporation. All rights reserved. 使用条件 |商標 |プライバシー |日本での個人情報の取り扱い
Microsoft