2017-03-23 5 views
0

node-ffiを使用してWin32 API FormatMessageAとインターフェースしようとしていますが、lpBufferパラメータを取得できないようですが、ここでは試したコードを表示します。ノード-ffiのWin32 API形式のメッセージ

'use strict'; 

    const ref = require('ref'); 
    const ffi = require('ffi'); 

    const Kernel32 = ffi.Library('Kernel32.dll', { 
     FormatMessageA: ['ulong', [ 
      'ulong', //flags 
      'void *', 
      'ulong', //status number 
      'ulong', //language 
      'uchar *', 
      'ulong', 
      'void *' 
     ]] 
    }); 


    const FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; 
    const FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x100; 
    const FORMAT_MESSAGE_IGNORE_INSERTS = 0x200; 

    const lpBuffer = ref.alloc('uchar *'); 

    const result = Kernel32.FormatMessageA(
     FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, 
     null, 
     0x80090300, //error code 
     0, 
     lpBuffer, 
     0, 
     null 
    ); 

    console.log(result); //prints 57 bytes 

私は必要なエラー文字列を含むlpBuffer値を取得することはできませんが、57が返されるため、関数は成功していることが分かります。

+0

[MSDN:FormatMessage関数](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v = vs.85).aspx): "_ lpBuffer'パラメータは次のとおりです。 'LPTSTR'へのポインタ('(LPTSTR)&lpBuffer'のような) 'LPTSTR'にポインタをキャストしなければなりません。第2の例(同じページの最後にあります)は' FORMAT_MESSAGE_ALLOCATE_BUFFER '。 – CristiFati

+0

これはデータ型を作成するためにffiを使用してjavascriptを使用していますか?私はこれをC言語で問題なく使用できます。外国のインターフェースを経由しないでください。 –

+0

はい、私は、_J_を使用している間はその例を知っていますが(私は全く知っていませんが)(あなたのコードは正しいと仮定します)、 'lpBuffer'は' ref.alloc( 'uchar **') 'でなければなりません(_JS_に意味があるかどうかはわかりません)。 – CristiFati

答えて

1

私は[MSDN] FormatMessage functionによると、私の1つのコメントで述べたように:説明

  • FORMAT_MESSAGE_ALLOCATE_BUFFER

    lpBufferパラメータがLPTSTRポインタです。あなたは、たとえば(LPTSTR(LPTSTR)&lpBuffer)をポインタをキャストする必要があり

  • (2 ND)の例をページの下部に:。

    // Some code (not relevant for this problem) 
    LPWSTR pBuffer = NULL; 
    // Some more code (still not relevant) 
    FormatMessage(FORMAT_MESSAGE_FROM_STRING | 
           FORMAT_MESSAGE_ALLOCATE_BUFFER, 
           pMessage, 
           0, 
           0, 
           (LPWSTR)&pBuffer, 
    // The rest of the code (not relevant) 
    

dwFlags引数FORMAT_MESSAGE_ALLOCATE_BUFFERで構成されている場合、この関数はLPTSTRTCHARへのポインタ)のlpBuffer引数が実際にはポインタからLPTSTRTCHARへのダブルポインタ)キャストからLPTSTRへのポインタ。

意味するだろう JS(私は経験がないこと)に翻訳し、

const lpBuffer = ref.alloc('uchar **'); 

を注意:同じページによると、バッファはそれが無いだときLocalFreeを使用して解放する必要がありますより長い時間が必要です(意味があります。FormatMessageはメモリを割り当てます。そのため、ダブルポインタが必要です)。繰り返しますが、JSLocalFreeuchar *(参照解除された)バッファで呼び出され、lpBufferでは直接呼び出されません)。

+0

はい私はJavaScriptのメモリリークを防ぐためにバッファを解放するためにGetProcessHeapとHeapFreeへのjavascriptインターフェイスを作成しなければなりませんでした。 –

関連する問題