2013-10-05 3 views
-1

Folks Я имею несбалансированный проблему стека см нижеLotus Notes C API Выпуск

DNParse ЗАВИСИМОСТИ в C API:

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

using FORMULAHANDLE = System.UInt32; 
using NullHandle = System.Nullable; 
using Status = System.UInt16; 
using DBHandle = System.IntPtr; 
using DHANDLE = System.IntPtr; 
using NoteID = System.UInt32; 
using ColHandle = System.UInt32; 
using WORD = System.UInt32; 
using DWORD = System.UInt32; 
using NoteHandle = System.IntPtr; 
using FontID = System.UInt32; 

public static unsafe string GetCurrentUserCommonName() 
    { 
     string str = ""; 
     Status sts = 0; 
     DWORD xDWORD = 0; 
     dname.DN_COMPONENTS DNComp = new dname.DN_COMPONENTS();    
     StringBuilder szServer = new StringBuilder(0x400, 0x400); 
     StringBuilder InName = new StringBuilder(0x400, 0x400); 

     Initialize(); 
     if (m_isInitialized) 
     { 
      sts = nnotesDLL.SECKFMGetUserName(szServer);     
      sts = nnotesDLL.DNParse(xDWORD, null, szServer, 
            DNComp, (Int16)Marshal.SizeOf(DNComp)); 
      // return CanonName.ToString(); 
     } 
     return str; 
    } 

И C# версии:

[DllImport("nnotes.dll")] 
public unsafe static extern Status DNParse(DWORD Flags, string TemplateName, 
              StringBuilder szServer, 
              dname.DN_COMPONENTS DNComp, 
              short CompSize); 
DN_COMPONENTS STRUCTURE 
public struct DN_COMPONENTS 
{ 
    .... 
} 
+0

Пожалуйста, объясните, что вы подразумеваете под «неуравновешенной проблемой стека». Что происходит, когда этот код работает? Чего вы ожидаете? –

ответ

0

ошибка заключается в том, что собственный код ожидает, что адрес структуры будет передан. Но ваш код C# передаёт структуру по значению. P/Invoke должен выглядеть следующим образом:

[DllImport("nnotes.dll")] 
public static extern Status DNParse(
    DWORD Flags, 
    string TemplateName, 
    string szServer, 
    ref dname.DN_COMPONENTS DNComp, 
    short CompSize 
); 

Некоторые другие моменты:

  1. Вам не нужно unsafe здесь. Убери это.
  2. Оба строковых параметра передаются функции, а буферы не изменяются. Это подразумевается const char*. Так маршал их как string.