基于GDAL提取地物,并生成png,最后加载到网页上(二)

C# 调用 C++ DLL  的struct 传递

C++  .h

#pragma once
typedef struct
{
	int nAge;
	bool bUse;
	double nDistance;
	char name[200];
}LIDBATATYPE;

typedef struct
{
	int progress;
	char msg[100];
}OUTMSG;

extern "C" _declspec(dllexport) int _stdcall PassStruct(LIDBATATYPE *mdata); //指针
extern "C" _declspec(dllexport) int _stdcall sendMsg(OUTMSG &msg);           //引用

C++ cpp

int _stdcall PassStruct(LIDBATATYPE *mdata)
{
	
	int age = mdata->nAge;
	bool use = mdata->bUse;
	double distance = mdata->nDistance;
	std::string n = mdata->name;
	mdata->nAge = 101;
	int a = age + 1;
	return a;
	
}
int _stdcall sendMsg(OUTMSG &msg)
{
	int pro = msg.progress;
	msg.progress = 123;
	//msg.msg = "cppmsg";
	std::string str = "cppmsg";
	//strcpy(msg.msg, str.c_str());
	//str.copy(msg.msg, 7, 0);
	int i;
	for ( i = 0; i < str.length(); i++)
	{
		msg.msg[i] = str[i];
	}
	msg.msg[i] = '\0';
	//printf("%s\n", p);
	return msg.progress;

}

  

[StructLayout(LayoutKind.Sequential,CharSet =CharSet.Ansi)]
public  struct OUTMSG
{
    public int progress;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public string msg;
}
public struct toCppData
{
    public int nAge;
    public bool bUse;
    public double nDistance;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
    public string name;
}

       [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test01", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        extern static int test01(int a, int b, int c);

        [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test02", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        extern static int test02(int a, int b);
      
        [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "ReadRaster", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        extern static int ReadRaster();
       
        [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "PassStruct", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        extern static int PassStruct(ref toCppData _data);

        [DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "sendMsg", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        extern static int sendMsg(ref OUTMSG msg);

        static void Main(string[] args)
        {
            //int r1 = test01(1, 2, 3);
            //int r2 = test02(5, 2);
            // int r3 = ReadRaster();
            // Console.WriteLine("test01结果:" + r3.ToString());
            //Console.WriteLine("test02结果:" + r2.ToString());

            toCppData data = new toCppData();
            data.nAge = 100;
            data.bUse = false;
            data.nDistance = 3.1415926;
            data.name = "abcd";
            int v = PassStruct(ref data);

            OUTMSG mMsg = new OUTMSG();
            mMsg.progress = 999;
            int ret = sendMsg(ref mMsg);
            int progress = mMsg.progress;
            Console.WriteLine("结果:" +mMsg.msg.ToString());


            Console.ReadKey();
        }

  

 

posted on 2019-08-27 11:11  markygis  阅读(629)  评论(0编辑  收藏  举报