zoukankan      html  css  js  c++  java
  • C#调用C++(QT5.5.1项目)的C++/CLI(CLR项目)项目技术笔记

    导航

      1.编译环境

      2.项目配置

        1.设置附加包含目录

        2.设置附加库目录

        3.设置附加依赖项

      3.CLR中各种定义

        1.接口定义

        2.类定义

        3.枚举定义

        4.属性定义

      4.CLR中各种使用

        1.类的实例化

        2.命名空间的使用

      5.CLR中数据类型的转换

        1.String ^ 到 QString 的转换

        2.QString 到 String ^ 的转换

        3.char * 到 String ^

        4.wchar_t * 到 String ^

        5.数组的转换

    1.编译环境

    系统:windows10

    环境:VS2010 + Qt5.5.1

    2.项目配置

    1.设置附加包含目录

    1.此项设置包含的头文件,需要填入用到的.h文件目录

    2.下图中的QTDIR是Qt5.5.1安装目录环境变量(默认路径:C:QtQt5.5.15.5msvc2010)

    2.设置附加库目录

    1.此项设置引用的lib目录,如下图。

    3.设置附加依赖项

    1.此处设置指定的lib文件,一般不用填写。

    3.CLR中各种定义

    1.接口定义

    2.类定义

    3.枚举定义

    4.属性定义

    1.接口中定义:

     2.类中定义:

    4.CLR中各种使用

    1.类的实例化

    所有.net对象都需要使用gcnew进行创建,gcnew创建的对象不需要自己手动释放内存。

    GTable ^ ret = gcnew GTable();

    2.命名空间的使用

    命名空间用于限定类,不同于C#,这里使用::进行分割。

    virtual MyNameSpace::ITable ^ GetTable(int index);

    5.CLR中数据类型的转换

    1.String ^ 到 QString 的转换

    QString MarshalString(String ^ s)
    {
    	using namespace Runtime::InteropServices;
    	const char* chars =
    		(const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
    	string str = chars;
    	QString ret = str.c_str();
    	Marshal::FreeHGlobal(IntPtr((void*)chars));
    	return ret;
    }
    

      

    2.QString 到 String ^ 的转换

    String ^ MarshalStringLocal8(QString os)
    {
    	using namespace Runtime::InteropServices;
    	if (os.isNull()) return nullptr;
    	QByteArray data = os.toLocal8Bit();
    	char * str = new char[data.length() + 1];
    	strcpy_s(str, data.length() + 1, data.constData());
    	String ^ ret = Marshal::PtrToStringAnsi(static_cast<IntPtr>(str));
    	delete str;
    	return ret;
    }
    String ^ MarshalString(QString os)
    {
    	using namespace Runtime::InteropServices;
    	QByteArray data = os.toUtf8();
    	char * str = new char[data.length() + 1];
    	strcpy_s(str, data.length() + 1, data.constData());
    	String ^ ret = Marshal::PtrToStringAnsi(static_cast<IntPtr>(str));
    	delete str;
    	return ret;
    }

    3.char * 到 String ^

    String ^ MarshalString(char* os) {
    	using namespace Runtime::InteropServices;
    	String ^ ret = Marshal::PtrToStringAnsi(static_cast<IntPtr>(os));
    	return ret;
    }

    4.wchar_t * 到 String ^

    String ^ MarshalString(wchar_t* os) {
    	using namespace Runtime::InteropServices;
    	String ^ ret = Marshal::PtrToStringUni((IntPtr)os);
    	return ret;
    }
    

    5.数组的转换

    using namespace System::Runtime::InteropServices;
    QByteArray byteArray = obj.toByteArray();
    int length = byteArray.count();
    array<Byte> ^ rbyteArray = gcnew array<Byte>(length + 2);
    Marshal::Copy((IntPtr)byteArray.data(), rbyteArray, 0, length);
    ret = rbyteArray;
    
  • 相关阅读:
    注解-案例
    注解(Annotation)
    适合新手看的超详细CentOS Linux 7 安装Tomcat8过程
    CentOS Linux 7 提示 lsof: 未找到命令
    解决MySql报错:1130
    Spring Boot 创建自定义的properties文件
    spring boot 使用Schedule创建轻量级定时任务
    4.Java数组模块
    3.IDEA开发工具
    2.java基础语法
  • 原文地址:https://www.cnblogs.com/zhuxiaoxiao/p/10515437.html
Copyright © 2011-2022 走看看