创建一个数组,并设置我试图创建一个数组值
问题描述:
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
);
答
我没有时间去检查,但“RAWR”分配应该是这样的
rgsFilenames[0] = ctypes.char.array()("rawr");
答
感谢@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}