日期:2014-05-18 浏览次数:21244 次
C++ SNMPAPI_STATUS SnmpStrToOid( __in LPCSTR string, __out smiLPOID dstOID );
------解决方案--------------------
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct SMIOID { [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.I4)] public uint size; public IntPtr dwords; }
------解决方案--------------------
注意第一个参数的类型是LPCSTR,而不是LPCTSTR。所以你要用[DllImport("wsnmp32.dll", CharSet=ANSI)](不是确切代码,大概如此)。
还有就是如果不是OUT类型的字符串参数,可以不使用StringBuilder。这里明显可以不用StringBuilder。
------解决方案--------------------
检查字符类型
------解决方案--------------------
用UnmanagedType试试.我之前也碰到过这个问题,将变量声明为UnmanagedType就解决了.
------解决方案--------------------
我看第一个象是C++里面没有符号的32位Long型数据,所以对应的应该是Uint32 没有错,可能是第二个参数需要限定下程度,也是32位,如果还不行我也没办法了:
StructLayout(LayoutKind.Sequential)] public struct SMIOID { public Uint32 size; [MarshalAs(UnmanagedType.I4, SizeConst=32)] public IntPtr dwords; } //然后调用的指针的函数改成下面的 [DllImport("wsnmp32.dll")] public static extern SNMPAPI_STATUS SnmpStrToOid(StringBuilder str, out ref SMIOID oid); StringBuilder name2 = new StringBuilder(256); name2.Append("1.3.6.1.2.1.2.2.1.16"); SnmpAPI.SnmpStrToOid(name2, out ref Oid);
------解决方案--------------------
这个问题我也遇到过,最终检查问题出在DLL里面,里面通过指针动态申请的空间没有释放.不知道你是不是跟我一样的.