2013-11-08 4 views
-1

Я не могу правильно передать правильные аргументы. Я получаюMarshaling er Pinvoke Головная боль

"Неверное имя Синтаксический размер буфера" ошибка

Lotus Notes функция dname.h

STATUS LNPUBLIC DNParse(
DWORD Flags, 
const char far *TemplateName, 
const char far *InName, 
DN_COMPONENTS far *Comp, 
WORD CompSize); 

структура ниже

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct DN_COMPONENTS 
{ 
     public int Flags; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string C; 
     public short OLength; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string O; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string CN; 
}; 

C#

Ниже то, что я попробовал

Status sts = 0; 
StringBuilder szServer = new StringBuilder(names.MAXUSERNAME); 
string notUsedString = null; 
DWORD notUsed = 0; 
dname.DN_COMPONENTS xdDC = new DN_COMPONENTS(); 
sts = nnotesDLL.SECKFMGetUserName(szServer);    
//IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(dname.DN_COMPONENTS))); 
//UInt16 num = Convert.ToUInt16(Marshal.SizeOf(structPtr)); 
//WORD num = Convert.ToUInt16(Marshal.SizeOf(structPtr)); 
int num = Marshal.SizeOf(typeof(DN_COMPONENTS));    
IntPtr structPtr = Marshal.AllocCoTaskMem(num); 



sts = nnotesDLL.DNParse(notUsed, notUsedString, szServer, structPtr, (UInt32)num); 
this.xdDC = (dname.DN_COMPONENTS)Marshal.PtrToStructure(structPtr, typeof(dname.DN_COMPONENTS)); 
xdDC.CN = Decode(Marshal.ReadIntPtr(structPtr), ushort.MaxValue); 

///CN=SomeFirstName SomeLastName/OU=Corp/O=test 

Ищу "SomeFirstName SomeLastName"

[DllImport("nnotes.DLL", CallingConvention = CallingConvention.StdCall)] 
public unsafe static extern Status DNParse(DWORD notUsed, string notUsedString,  StringBuilder  InName, IntPtr structPtr, UInt32 structPtrSizeOf); 

Я попробовал все варианты от исх всем, ссылка на структуру, изменен на строки, INT, UINT Ничего !!!

Помощь ...

Что я ищу, CN = SomeFirstName SomeLastName/OU = Corp/O = тест

+0

Вы не указали собственное объявление структуры. Почему вы выбрали Pack = 1? Во всяком случае, то, что вы пытаетесь, не может работать. Вам нужно объявить строки как «IntPtr» и использовать «Marshal.PtrToStringAnsi», чтобы их прочитать. –

+0

http://www-12.lotus.com/ldd/doc/domino_notes/9.0/api90ref.nsf/852561bd0045e8e785255b3c005a57bb/24d9907b9ecc4fff8525667700438cc1?OpenDocument&Highlight=0,DN_COMPONENTS – user2697657

+0

Смотрите ссылку на структуру родной – user2697657

ответ

0

Проблемы, которые я могу видеть:

  • Вы не сделали объявить все поля в структуре.
  • Маловероятно, что структура упакована. Удалите настройку Pack.
  • Вам нужно объявить указатели в структуре как IntPtr. Маршаллер не может вывести их из родного в управляемый. Объявите их как IntPtr и используйте Marshal.PtrToStringAnsi для преобразования.
Смежные вопросы