C#调用C++DLL出现的错误
C++的.h声明
__declspec(dllimport)
FT_HANDLE WINAPI FT_W32_CreateFile(
LPCSTRlpszName,
DWORDdwAccess,
DWORDdwShareMode,
LPSECURITY_ATTRIBUTESlpSecurityAttributes,
DWORDdwCreate,
DWORDdwAttrsAndFlags,
HANDLEhTemplate
);
___________________________________________
C#
using FT_HANDLE=System.IntPtr;
using LPVOID = System.IntPtr;
using LPCSTR=System.String;
using FT_STATUS = System.Int64;
using DWORD = System.UInt64;
using HANDLE = System.IntPtr;
using BOOL=System.Boolean ;
___________________________________________________________________
[DllImport( "FTD2XX.Dll ")]
public static extern FT_HANDLE FT_W32_CreateFile(LPCSTR lpszName, DWORD dwAccess, DWORD dwShareMode, out
_SECURITY_ATTRIBUTES
lpSecurityAttributes, DWORD dwCreate, DWORD
dwAttrsAndFlags, HANDLE hTemplate);
public struct _SECURITY_ATTRIBUTES
{
public DWORD nLength;
public LPVOID lpSecurityDescriptor;
public BOOL bInheritHandle;
} ;
public static void SendPackage(string str)
{
FT_STATUS ftStatus;
FT_HANDLE ftHandle;
string buf= "usb ";
_SECURITY_ATTRIBUTES tmp;
//ftStatus = FT_ListDevices(0, Buf, FT_LIST_BY_INDEX | FT_OPEN_BY_SERIAL_NUMBER);
ftHandle = FT_W32_CreateFile(buf, (ulong)0x80000000L | 0x40000000L, 0, out tmp, (ulong)3, (ulong)
0x00000080 | 0x40000000 | 1, (IntPtr)0);
}
提示出错:
对 PInvoke 函数“ProtocolX!ProtocolX.ProtocolUsb2_0_1::FT_W32_CreateFile”的调用导致堆栈不对称。原因可能是托管的
PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
请高手帮助
[解决办法]
帮顶
[解决办法]
匹配一直就是.Net调用C++动态库出现的问题。以后还是用.Net写Dll,直接引用方便,呵呵
[解决办法]
[DllImport( "kernel32.dll ")]
private static extern int CreateFile(
string lpFileName, // file name
uint dwDesiredAccess, // access mode
int dwShareMode, // share mode
int lpSecurityAttributes, // SD
int dwCreationDisposition, // how to create
int dwFlagsAndAttributes, // file attributes
int hTemplateFile // handle to template file
);
别人把 _SECURITY_ATTRIBUTES这个结构体直接用int型替换
这个结构体一般不用,它涉及到安全问题,一般用不到,你再试试吧