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が返されるため、関数は成功していることが分かります。
[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
これはデータ型を作成するためにffiを使用してjavascriptを使用していますか?私はこれをC言語で問題なく使用できます。外国のインターフェースを経由しないでください。 –
はい、私は、_J_を使用している間はその例を知っていますが(私は全く知っていませんが)(あなたのコードは正しいと仮定します)、 'lpBuffer'は' ref.alloc( 'uchar **') 'でなければなりません(_JS_に意味があるかどうかはわかりません)。 – CristiFati