作者theodolite (无)
看板C_Sharp
标题[问题] DllImport回传LPBYTE的问题?
时间Thu May 7 19:33:52 2009
有关比较基本的DllImport已经可以成功了,目前的问题是要呼叫:
HRESULT __stdcall CeSvcGetBinary
(HCESVC hSvc, LPCSTR pszValName, LPBYTE pszVal, LPDWORD pcbVal);
这部份我在c#中有试过:
[DllImport("ceutil.dll")]
public static extern Uint32 CeSvcGetBinary
(IntPtr hSvc, string pszValName, //这部份没什麽问题
[Out] IntPtr pszVal, //这个不确定怎麽回传
ref int pcbVal);
使用上则是:
int dataLength = 0;
IntPtr dataByte = Marshal.AllocHGlobal (32);//32 bytes
hr = CeSvcGetBinary (phSvc, "BinaryData", dataBytes, ref dtaLength);
//使用Marshal将资料从dataByte中读出来
byte[] dataDump = new byte [dataLength];
for(int index = 0; index < dataLength; index++)
dataDump[index] = Marshal.ReadByte(dataBytes, index);
这是我目前试出来会有资料写进去,但是资料是错误的。因为是透过CEUtil去读Registry
KEY是固定值,没理由每次读出来都不对,但是这是我目前达成的。
这样的HRESULT会是0x800700ea,看起来像是ERROR_MORE_DATA,
但是不论给多少的空间都一样,所以想说问题应该不是如此才对。
有关pszVal,我有试过像是ref byte[] pszVal或是其他直接byte array,
都不会有任何回应。
用String似乎比较简单,可以用StringBuilder,是否应该尝试用StringBuilder?
还是我的观念上仍然有问题?请各位不吝指教,谢谢。
补充:StringBuilder也不太妙,但是参考PInvoke网站上的写法,
是直接传byte[]进去?不知有没有成功的案例?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.63.100.2
1F:→ pico2k:dataDump[pos] -> dataDump[index] ? 05/08 01:02
2F:→ pico2k:Net Framework有读取registry的相关API 05/08 01:04
3F:→ theodolite:要透过CEUtil是为了避免未来registry的位置变动 05/08 09:20
※ 编辑: theodolite 来自: 210.63.100.2 (05/08 14:23)