2014-09-27 151 views
0

创建一个数组,并设置我试图创建一个数组值

var rgsFilenamesType = ctypes.ArrayType(ctypes.char.ptr); 
var rgsFilenames = new rgsFilenamesType(1); 
rgsFilenames[0] = 'rawr'; //OS.Path.join(OS.Constants.Path.profileDir, 'parent.lock'); 

但它不断告诉我:

Exception: expected type pointer, got "rawr" 

我的目标是要在这里传递给这个函式:

dwError = RmRegisterResources(dwSession, rgsFilenames.length, rgsFilenames, 0, null, 0, null); 

声明此功能:

/* http://msdn.microsoft.com/en-us/library/windows/desktop/aa373663%28v=vs.85%29.aspx 
* DWORD WINAPI RmRegisterResources(
* __in_  DWORD dwSessionHandle, 
* __in_  UINT nFiles, 
* __in_opt_ LPCWSTR rgsFilenames[ ], 
* __in_  UINT nApplications, 
* __in_opt_ RM_UNIQUE_PROCESS rgApplications[ ], 
* __in_  UINT nServices, 
* __in_opt_ LPCWSTR rgsServiceNames[ ] 
*); 
*/ 
var RmRegisterResources = lib.rstrtmgr.declare('RmRegisterResources', ctypes.winapi_abi, ctypes.unsigned_long, // DWORD 
    ctypes.uint32_t, // DWORD 
    ctypes.unsigned_int, // UINT 
    ctypes.ArrayType(ctypes.char.ptr, 1), // LPCWSTR 
    ctypes.unsigned_int, // UINT 
    ctypes.ArrayType(struct_RM_UNIQUE_PROCESS, 1), // RM_UNIQUE_PROCESS 
    ctypes.unsigned_int, // UINT 
    ctypes.ArrayType(ctypes.char.ptr, 1) // LPCWSTR 
); 

回答

0

我没有时间去检查,但“RAWR”分配应该是这样的

rgsFilenames[0] = ctypes.char.array()("rawr"); 
0

感谢@paa人。 @ John-Galt向我展示了如何让它运作起来。

他这样做,使阵列:

let strings = ['rawr', 'blah'].map(s => ctypes.char.array()(s)); 
let a = ctypes.char.ptr.array(strings.length)(); 
strings.forEach((s, i) => { a[i] = s; }); 

然后在函数声明我们改变ctypes.ArrayType(ctypes.char.ptr, 1)ctypes.char.ptr.array()

和它的工作! :)

即时通过自定义类型做了相同的困难。

像我改变ARG申报从ctypes.ArrayType(struct_RM_UNIQUE_PROCESS, 1)struct_RM_UNIQUE_PROCESS.ptr.array()但后来我不知道如何创建一个数组填充这些元素。我试过这个:

let rgApplicationsNonCData = struct_RM_UNIQUE_PROCESS.array(2)(); 
rgApplicationsNonCData[0].dwProcessId = 123; 
rgApplicationsNonCData[0].ProcessStartTime = BLAHOBJECT; 

rgApplicationsNonCData[1].dwProcessId = 123; 
rgApplicationsNonCData[1].ProcessStartTime = BLAHOBJECT; 
console.log('rgApplicationsNonCData:', rgApplicationsNonCData) 

let rgApplications = struct_RM_UNIQUE_PROCESS.ptr.array(rgApplicationsNonCData.length)(); 
console.log('rgApplications:', rgApplications) 

它没有抛出任何错误,但这是正确的方式?如何检查其内容?

实际的代码来创建RM)UNIQUE_PROCESSS阵列:

let rgApplicationsNonCData = struct_RM_UNIQUE_PROCESS.array(2)(); 
    rgApplicationsNonCData[0].dwProcessId = 123; 
    rgApplicationsNonCData[0].ProcessStartTime = new struct_FILETIME(); 
    rgApplicationsNonCData[0].ProcessStartTime.dwLowDateTime = 111; 
    rgApplicationsNonCData[0].ProcessStartTime.dwHighDateTime = 222; 

    rgApplicationsNonCData[1].dwProcessId = 123; 
    rgApplicationsNonCData[1].ProcessStartTime = new struct_FILETIME(); 
    rgApplicationsNonCData[1].ProcessStartTime.dwLowDateTime = 111; 
    rgApplicationsNonCData[1].ProcessStartTime.dwHighDateTime = 222; 

    console.log('rgApplicationsNonCData:', rgApplicationsNonCData); 

    let rgApplications = struct_RM_UNIQUE_PROCESS.ptr.array(rgApplicationsNonCData.length)(); 
    console.log('rgApplications:', rgApplications) 

console.log('rgApplications:', rgApplications)console.log('rgApplicationsNonCData:', rgApplicationsNonCData);不表现出比CData {length:2}

以外的任何