各位,我遇到了堆栈不平衡问题,请参见下文
C API 中的 DNParse 函数:
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
{
....
}
最佳答案
错误是 native 代码期望传递结构的地址。但是您的 C# 代码是按值传递结构的。 p/invoke 应如下所示:
[DllImport("nnotes.dll")]
public static extern Status DNParse(
DWORD Flags,
string TemplateName,
string szServer,
ref dname.DN_COMPONENTS DNComp,
short CompSize
);
其他一些要点:
- 这里不需要
不安全
。将其删除。 - 两个字符串参数都会传递到函数中,并且缓冲区不会被修改。
const char*
暗示了这一点。因此,将它们编码为字符串
。
关于c# - Lotus Notes c API 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193860/