стал завершать строку двумы нулями, работает, с одним нулем тоже работает, но самая первая строка в массиве содержит левые символы в конце, а с двумя нулями все пучком. Вот мой код:
c#private static IntPtr[] StringToIntPtrArray(string[] strings)
{
IntPtr[] ptrs = new IntPtr[strings.Length];
for (int i = 0; i < strings.Length; ++i)
{
string str = strings[i];
ArrayList stringBytes = new ArrayList();
stringBytes.AddRange(Encoding.Unicode.GetBytes(str));
if (!str.EndsWith("\0\0"))
{
stringBytes.Add((byte)'\0');
stringBytes.Add((byte)'\0');
}
IntPtr ptr = IntPtr.Zero;
try
{
ptr = Marshal.AllocHGlobal(stringBytes.Count);
Marshal.Copy((byte[])stringBytes.ToArray(typeof(byte))
,0
,ptr
,stringBytes.Count);
ptrs[i] = ptr;
}
catch
{
if (ptr != IntPtr.Zero)
Marshal.FreeHGlobal(ptr);
throw;
}
}
return ptrs;
}
static void Main(string[] args)
{
IntPtr[] pointers = null;
IntPtr pointersPtr = IntPtr.Zero;
try
{
pointers = StringToIntPtrArray(new String[] { "aaaa"
,"1111"
,"qwerty" });
pointersPtr = Marshal.AllocHGlobal(
Marshal.SizeOf(pointersPtr) * pointers.Length);
Marshal.Copy(pointers,0,pointersPtr,pointers.Length);
Init(pointersPtr);
}
finally
{
foreach (IntPtr pointer in pointers)
if (pointer != IntPtr.Zero)
Marshal.FreeHGlobal(pointer);
Marshal.FreeHGlobal(pointersPtr);
}
}
[DllImport(DllPath
,CallingConvention = CallingConvention.StdCall
,CharSet = CharSet.Unicode
,SetLastError = true)]
public extern static void Init(IntPtr strData);C++
void Init (PCWSTR* str)
{
//str[0] и т.д. содержат переданные строки
PCWSTR aa = str[0];
PCWSTR a1 = str[1];
PCWSTR a2 = str[2];
}
unspoken words, лучший хостинг, место работы, лучший поиск
Данное сообщение получено с сайта GotDotNet.RU
|