问题描述
- 请问这个C++的dll在C#中怎么调呀?急……在线等!
-
C++中的调用:
extern "C" _declspec(dllimport) int ReadGzjzzData(char* pData,char* photo,int * iErrCode);void CReadGzjzzDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
// OnOK();
char Data[64*1024] = {0};//各字段用双竖“||”分隔。
char photo[10*1024] = {0};
int iErrCode = 0;
BOOL ret = ReadGzjzzData(Data,photo,&iErrCode);
if(ret)
{
//数据保存操作
}
}
C#中是怎样的呢???
解决方案
已解决,谢谢各位。我解决如下:
[DllImport("Gzjzz.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern Int32 ReadGzjzzData(IntPtr data, IntPtr photo, ref int iErrCode);
public static int GPReadGzjzzData(ref string datastr, ref string photostr, ref int iErrCode)
{
int ERROR = 0;
IntPtr data = Marshal.AllocHGlobal(64 * 1024);
IntPtr photo = Marshal.AllocHGlobal(10 * 1024);
int ret = ReadGzjzzData(data, photo, ref ERROR);
datastr = Marshal.PtrToStringAnsi(data);
photostr = Marshal.PtrToStringAnsi(photo);
Marshal.FreeHGlobal(data);
Marshal.FreeHGlobal(photo);
return ret;
}
解决方案二:
public partial class CReadGzjzzDlg
{
public void OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
// OnOK();
sbyte[] Data = new sbyte[64 * 1024]; //各字段用双竖"||"分隔。
sbyte[] photo = new sbyte[10 * 1024];
int iErrCode = 0;
int ret = ReadGzjzzData(Data, photo, iErrCode);
if (ret != 0)
{
//数据保存操作
}
}
}
解决方案三:
对应dllimport怎么声明?
解决方案四:
这样不行,调用时提示:托管调试助手“PInvokeStackImbalance”在“C:UsersAdministratorDesktop222sCardTestreadJzzInfobinDebugreadJzzInfo.vshost.exe”中检测到问题。
解决方案五:
C#调用c++ dll
http://blog.csdn.net/jiangxinyu/article/details/7848015
http://www.cnblogs.com/dragonwlb/archive/2013/04/04/2999729.html
解决方案六:
[DllImport("你的.dll", EntryPoint = "#1你的第几个导出函数", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ReadGzjzzData(StringBuilder pData,StringBuilder photo,IntPtr iErrCode);