Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Сообщение

Nisus


Настоящий Флеймер

Зарегистрирован:
18 February 2005
Сообщения: 1982
Примеры кода: 0
 

Маршаллинг PCWSTR* и string[]

29 July 2008 11:54  


стал завершать строку двумы нулями, работает, с одним нулем тоже работает, но самая первая строка в массиве содержит левые символы в конце, а с двумя нулями все пучком. Вот мой код:
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
Наверх
  



Общие вопросы программирования на ASP.NET

 Маршаллинг PCWSTR* и string[]journeyman  24 July 2008 09:47
 Маршаллинг PCWSTR* и string[]Nisus  24 July 2008 11:56
 Маршаллинг PCWSTR* и string[]journeyman  24 July 2008 13:24
 Маршаллинг PCWSTR* и string[]Nisus  24 July 2008 14:24
 Маршаллинг PCWSTR* и string[]journeyman  24 July 2008 14:47
 Маршаллинг PCWSTR* и string[]Nisus  24 July 2008 16:13
 Маршаллинг PCWSTR* и string[]journeyman  25 July 2008 09:55
 Маршаллинг PCWSTR* и string[]Nisus  25 July 2008 10:39
 Маршаллинг PCWSTR* и string[]journeyman  25 July 2008 13:29
 Маршаллинг PCWSTR* и string[]Nisus  25 July 2008 14:03
 Маршаллинг PCWSTR* и string[]journeyman  25 July 2008 15:15
 Маршаллинг PCWSTR* и string[]Nisus  25 July 2008 15:25
 Маршаллинг PCWSTR* и string[]journeyman  25 July 2008 15:48
 Маршаллинг PCWSTR* и string[]Nisus  25 July 2008 17:14
 Маршаллинг PCWSTR* и string[]journeyman  25 July 2008 21:04
 Маршаллинг PCWSTR* и string[]Nisus  28 July 2008 09:57
 Маршаллинг PCWSTR* и string[]journeyman  29 July 2008 10:40
 Маршаллинг PCWSTR* и string[]Nisus  29 July 2008 11:54
 Маршаллинг PCWSTR* и string[]journeyman  30 July 2008 08:47
 Маршаллинг PCWSTR* и string[]Nisus  30 July 2008 10:41
 Маршаллинг PCWSTR* и string[]journeyman  24 July 2008 14:54
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта