string в char*
Пишу на С# так:
Код:
public class Import
{
[DllImport("PopUpStopper.dll")]
public static extern unsafe void
GetNamesList(char* nW);
}
{
[DllImport("PopUpStopper.dll")]
public static extern unsafe void
GetNamesList(char* nW);
}
И вызов :
Код:
unsafe
{
MessageBox.Show(richTextBox1.Text);
Import.GetNamesList(richTextBox1.Text.ToCharArray());
}
{
MessageBox.Show(richTextBox1.Text);
Import.GetNamesList(richTextBox1.Text.ToCharArray());
}
Вот функция которой это все передается:
Код:
DLL void GetNamesList(char* nW)
{
Holder=dg_malloc(lstrlen(nW)+1);
lstrcpy(Holder,nW);
MessageBox(NULL,Holder,"Dll test",NULL);
}
{
Holder=dg_malloc(lstrlen(nW)+1);
lstrcpy(Holder,nW);
MessageBox(NULL,Holder,"Dll test",NULL);
}
После всех этих манипуляций появляется пустой MessageBox
Перепробовал кучю методов но ничего не помогает.
Это вообще возможно на C#.
Я в нем чайник.Только позавчера учить начал, прельстивщись простотой создания интерфейса.
[DllImport("PopUpStopper.dll")]
public static extern unsafe void
GetNamesList([MarshalAs(UnmanagedType.LPStr)] char[] nW);
А вот в dll-ке оучше бы так написал:
DLL void GetNamesList(lpStr nW)
{
Holder=dg_malloc(lstrlen(nW)+1);
lstrcpy(Holder,nW);
MessageBox(NULL,Holder,"Dll test",NULL);
}
Можешь попробовать различные манипуляции с маршаллингом. И обрати внимание, что тип аргумента в импортируемой функции не char*, а char[], ведь в .NET нет указателей, а есть ссылки.
Цитата:
Originally posted by 3A3-968M
Попробуй через маршаллинг:
[DllImport("PopUpStopper.dll")]
public static extern unsafe void
GetNamesList([MarshalAs(UnmanagedType.LPStr)] char[] nW);
А вот в dll-ке оучше бы так написал:
DLL void GetNamesList(lpStr nW)
{
Holder=dg_malloc(lstrlen(nW)+1);
lstrcpy(Holder,nW);
MessageBox(NULL,Holder,"Dll test",NULL);
}
Можешь попробовать различные манипуляции с маршаллингом. И обрати внимание, что тип аргумента в импортируемой функции не char*, а char[], ведь в .NET нет указателей, а есть ссылки.
Попробуй через маршаллинг:
[DllImport("PopUpStopper.dll")]
public static extern unsafe void
GetNamesList([MarshalAs(UnmanagedType.LPStr)] char[] nW);
А вот в dll-ке оучше бы так написал:
DLL void GetNamesList(lpStr nW)
{
Holder=dg_malloc(lstrlen(nW)+1);
lstrcpy(Holder,nW);
MessageBox(NULL,Holder,"Dll test",NULL);
}
Можешь попробовать различные манипуляции с маршаллингом. И обрати внимание, что тип аргумента в импортируемой функции не char*, а char[], ведь в .NET нет указателей, а есть ссылки.
Спасибо огромное помогло.
Хотя нет не помогло выдает вот что:
System.Runtime.InteropServices.MarshalDirectiveException: Невозможно упаковать "parameter #1": Недопустимое сочетание управляемого и неуправляемого типов (массивы можно упаковывать только как LPArray, ByValArray или SafeArray).
Ну тогда так:
public static extern unsafe void
GetNamesList(char[] nW);
или так:
public static extern unsafe void
GetNamesList([MarshlAs(UnmanagedType.LPStr)] string nW);