在C#中应该为指针char *传递什么参数?

问题描述

我有一个用C ++编写的第三方dll,已使用DllImport在c#中导入。

他们还提供了有关调用函数的文档。有些函数易于处理,没有传递任何参数。现在,我不知道如何调用带有C#中传递的指针参数的函数,如下图所示。

enter image description here

这是我的代码

 [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

这是在c ++演示中调用函数的方式

 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;
     

    }