问题描述
我有一个用C ++编写的第三方dll,已使用DllImport
在c#中导入。
他们还提供了有关调用函数的文档。有些函数易于处理,没有传递任何参数。现在,我不知道如何调用带有C#中传递的指针参数的函数,如下图所示。
这是我的代码
[DllImport(third-parth.dll")]
public static extern int ReadInfo( ref StringBuilder MagInfo,ref StringBuilder TicketNumber,string BmpFileNamePath,int PicFormat);
public int read_info()
{
StringBuilder Mag = new StringBuilder(100);
string path = "folder";
return ReadInfo( ref Mag,ref Mag,path,1);
}
在https://stackoverflow.com/a/28497747上看到了此示例
编辑:
StringBuilder Mag = new StringBuilder(100);
StringBuilder ticket = new StringBuilder(100);
string path = @"D:\folder";
return ReadInfo( Mag,ticket,0);
我也尝试了两种调用约定
我在c ++文件之一中发现了这一点,可能有助于找出答案。
typedef int (__stdcall *ReadInfo)(char* MagInfo,char* TicketNumber,char* BmpFileNamePath,int PicFormat);
编辑:2
int CScanChequeDllDemo_VCDlg::ReadImage_BackSide()
{
//*************************************************************
//Read back side image data status,user can read back side image.
if(Global_Devstatus.iStatus == SCANCHEQUE_STATUS_SCAN_REVERSED)
{
//*************************************************************
//have image data
if(Global_Devstatus.iHaveData != 0)
{
memset(Global_MagInfo,0x00,sizeof(Global_MagInfo));
memset(Global_TicketNumber,sizeof(Global_TicketNumber));
memset(Global_BmpFileNamePath,sizeof(Global_BmpFileNamePath));
//*************************************************************
//Read back side image data
Global_returnValue = U_ReadInfo(Global_MagInfo,Global_TicketNumber,Global_BmpFileNamePath,Global_PicFormat);
//refresh picture
ShowImage(this,NULL);
//show status
ShowStatus(Global_returnValue);
if(Global_returnValue == SCANCHEQUE_ERROR_WRITEFILE)
{
//wait for instruction from the application software
}
//*************************************************************
//Get device status
Global_returnValue = U_QueryStatus(&Global_Devstatus);
if(Global_returnValue != SCANCHEQUE_SUCCESS)
{
ShowStatus(Global_returnValue);
return -1;
}
}
}
return 0;
}
这是全局变量
char Global_MagInfo[1024] = {0x00};
char Global_TicketNumber[1024] = {0x00};
char Global_BmpFileNamePath[1024] = {0x00};
int Global_PicFormat = (IMAGE_FORMAT_BMP | IMAGE_FORMAT_JPG | IMAGE_FORMAT_TIFF);//reversed
解决方法
我可以看到两个错误。如注释中所指出的,您可能需要分配StringBuilder
的两个实例。并且StringBuilder
自变量不应包含ref
。
调用约定很可能是错误的。从问题中显示的代码中我们不能确定它应该是什么。
尽管默认值是ANSI,所以我也建议对字符集进行明确说明。
,回答我自己的问题也许会对某人有所帮助
[DllImport(@yourDLL",EntryPoint ="ReadInfo",CharSet = CharSet.Ansi)]
public static extern int ReadInfo(IntPtr MagInfo,IntPtr TicketNumber,IntPtr BmpFileNamePath,int picFormat);
public int read_info()
{
IntPtr m = Marshal.AllocHGlobal(1024);
IntPtr t = Marshal.AllocHGlobal(1024);
IntPtr p = Marshal.AllocHGlobal(1024);
int result = ReadInfo(m,t,p,0);
string mginfo = Marshal.PtrToStringAnsi(m);
string tinfo = Marshal.PtrToStringAnsi(t);
string pth = Marshal.PtrToStringAnsi(p);
Console.WriteLine(mginfo);
Console.WriteLine(pth);
Marshal.FreeHGlobal(m);
Marshal.FreeHGlobal(t);
Marshal.FreeHGlobal(p);
return result;
}