c#调用c++ dll的几种类型转换

2023-10-29

在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家:
VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等
但转为C#类型却不完全相同。
主要有如下几种转换:
将string转为IntPtr:IntPtr System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(string)
将IntPtr转为string:string System.Runtime.InteropServices.MarshalPtrToStringAuto(IntPtr)

类型对照:
BSTR --------- StringBuilder
LPCTSTR --------- StringBuilder
LPCWSTR --------- IntPtr
handle---------IntPtr
hwnd-----------IntPtr
char *----------string
int * -----------ref int
int &-----------ref int
void *----------IntPtr
unsigned char *-----ref byte
Struct需要在C#里重新定义一个Struct
CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);
注意在每个函数的前面加上public static extern +返回的数据类型,如果不加public ,函数默认为私有函数,调用就会出错。

API数据类型
类型描述
C#类型
WORD
16 位无符号整数
ushort
LONG
32 位无符号整数
int
DWORD
32 位无符号整数
uint
HANDLE
句柄 ,32 位整数
int
UINT
32 位无符号整数
uint
BOOL
32 位布尔型整数
bool
LPSTR
指向字符的 32 位指针
string
LPCSTR
指向常字符的 32 位指针
String
BYTE
字节
byte
CHAR
字符
char
DWORDLONG
64 位长整数
long
HDC
设备描述表句柄
int
HGDIOBJ
GDI 对象句柄
int
HINSTANCE
实例句柄
int
HWM
窗口句柄
int
HPARAM
32 位消息参数
int
LPARAM
32 位消息参数
int
WPARAM
32 位消息参数
int

 

API
C# 数据类型
BOOL
System.Int32
BOOLEAN
System.Int32
BYTE
System.UInt16
CHAR
System.Int16
COLORREF
System.UInt32
 
 
DWORD
System.UInt32
DWORD32
System.UInt32
DWORD64
System.UInt64
FLOAT
System.Float
HACCEL
System.IntPtr
 
 
HANDLE
System.IntPtr
HBITMAP
System.IntPtr
HBRUSH
System.IntPtr
HCONV
System.IntPtr
HCONVLIST
System.IntPtr
 
 
HCURSOR
System.IntPtr
HDC
System.IntPtr
HDDEDATA
System.IntPtr
HDESK
System.IntPtr
HDROP
System.IntPtr
 
 
HDWP
System.IntPtr
HENHMETAFILE
System.IntPtr
HFILE
System.IntPtr
HFONT
System.IntPtr
HGDIOBJ
System.IntPtr
 
 
HGLOBAL
System.IntPtr
HHOOK
System.IntPtr
HICON
System.IntPtr
HIMAGELIST
System.IntPtr
HIMC
System.IntPtr
 
 
HINSTANCE
System.IntPtr
HKEY
System.IntPtr
HLOCAL
System.IntPtr
HMENU
System.IntPtr
HMETAFILE
System.IntPtr
 
 
HMODULE
System.IntPtr
HMONITOR
System.IntPtr
HPALETTE
System.IntPtr
HPEN
System.IntPtr
HRGN
System.IntPtr
 
 
HRSRC
System.IntPtr
HSZ
System.IntPtr
HWINSTA
System.IntPtr
HWND
System.IntPtr
INT
System.Int32
 
 
INT32
System.Int32
INT64
System.Int64
LONG
System.Int32
LONG32
System.Int32
LONG64
System.Int64
 
 
LONGLONG
System.Int64
LPARAM
System.IntPtr
LPBOOL
System.Int16[]
LPBYTE
System.UInt16[]
LPCOLORREF
System.UInt32[]
 
 
LPCSTR
System.String
LPCTSTR
System.String
LPCVOID
System.UInt32
LPCWSTR
System.String
LPDWORD
System.UInt32[]
 
 
LPHANDLE
System.UInt32
LPINT
System.Int32[]
LPLONG
System.Int32[]
LPSTR
System.String
LPTSTR
System.String
 
 
LPVOID
System.UInt32
LPWORD
System.Int32[]
LPWSTR
System.String
LRESULT
System.IntPtr
PBOOL
System.Int16[]
 
 
PBOOLEAN
System.Int16[]
PBYTE
System.UInt16[]
PCHAR
System.Char[]
PCSTR
System.String
PCTSTR
System.String
 
 
PCWCH
System.UInt32
PCWSTR
System.UInt32
PDWORD
System.Int32[]
PFLOAT
System.Float[]
PHANDLE
System.UInt32
 
 
PHKEY
System.UInt32
PINT
System.Int32[]
PLCID
System.UInt32
PLONG
System.Int32[]
PLUID
System.UInt32
 
 
PSHORT
System.Int16[]
PSTR
System.String
PTBYTE
System.Char[]
PTCHAR
System.Char[]
PTSTR
System.String
 
 
PUCHAR
System.Char[]
PUINT
System.UInt32[]
PULONG
System.UInt32[]
PUSHORT
System.UInt16[]
PVOID
System.UInt32
 
 
PWCHAR
System.Char[]
PWORD
System.Int16[]
PWSTR
System.String
REGSAM
System.UInt32
SC_HANDLE
System.IntPtr
 
 
SC_LOCK
System.IntPtr
SHORT
System.Int16
SIZE_T
System.UInt32
SSIZE_
System.UInt32
TBYTE
System.Char
 
 
TCHAR
System.Char
UCHAR
System.Byte
UINT
System.UInt32
UINT32
System.UInt32
UINT64
System.UInt64
 
 
ULONG
System.UInt32
ULONG32
System.UInt32
ULONG64
System.UInt64
ULONGLONG
System.UInt64
USHORT
System.UInt16
 
 
WORD
System.Short
WPARAM
System.IntPtr
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c#调用c++ dll的几种类型转换 的相关文章

  • C++ std::accumulate 没有给出预期的总和

    double numbers 1 0 5 0 333333 0 25 0 2 0 166667 0 142857 0 125 0 111111 0 1 std vector
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 从结构调用 C++ 成员函数指针

    我找到了有关调用 C 成员函数指针和调用结构中的指针的信息 但我需要调用结构内部存在的成员函数指针 但我无法获得正确的语法 我在类 MyClass 的方法中有以下代码片段 void MyClass run struct int MyClas
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 使用任一默认捕获模式时,这是通过复制捕获还是 (*this) 通过引用捕获?是一样的吗?

    当我看到以下工作时我有点困惑 struct A void g void f g 但后来我发现this https stackoverflow com a 16323119 5825294答案非常详细地解释了它是如何工作的 本质上 它归结为t
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 在一个解决方案中调用不同项目的方法

    1 个解决方案中有 3 个项目 我对第一个项目中的主文件进行的主要操作 但是我需要调用第三个项目中的方法并使用类 例如 第三个项目有 public DataClasses1DataContext base global WindowsFor
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • C# 多维数组解析

    我有一个多维数组 内容在调试器中看起来像这样 数组设置为 String s new String 6 4 A B Yes C A B Yes C A B No C A B Yes C A B Yes C A B Yes C A B No C
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • Ubuntu16.04 搭建Android源码的git+gitosis+repo代码管理的服务器

    一份源码 要让团队里的人能够轻松地拉取 以下是我的搭建过程 1 关于源码及相关编译环境参考我之前的一篇博文https blog csdn net qq 28449863 article details 79978937 2 简单做个描述 所
  • 2分钟学会Python绘制蟒蛇!

    目录 一 Python蟒蛇绘制 问题分析 1 1 Python蟒蛇绘制 二 Python蟒蛇绘制 实例编写 三 运行效果 3 1 程序关键 四 Python蟒蛇绘制 举一反三 4 1 Python语法元素理解 4 2 程序参数的改变 4 3
  • 吐槽大会,来瞧瞧资深老前端写的垃圾代码

    忍无可忍 不吐不快 本期不写技术文章 单纯来吐槽下公司项目里的奇葩代码 还都是一些资深老前端写的 希望各位对号入座 知道了什么是烂代码 才能写出好代码 别说什么代码和人有一个能跑就行的话 玩笑归玩笑 人都有菜的时候 写出垃圾代码无可厚非 但
  • 面试时,被问到频繁跳槽该如何回应?

    有数据显示 现在的职场人 跳槽越来越频繁 95后平均7个月就离职 对于面试官来说 一个跳槽过于频繁的人总是存在潜在风险 比如抗压力差 稳定性不好 心不定这山望着那山高 职业规划不清晰等等 我一直强调一个观点 职场人跳槽 应该是为了下一步有更
  • 十八、部署 Vue.js 项目到生产环境

    本章概要 构建发布版本 部署 项目开发完毕并测试后 就要准备构建发布版本 部署到生产环境 18 1 构建发布版本 在构建发布版本前 注意将项目代码中用于调试的 alert debugger console log 等语句删除或注释 在生产环
  • Linux目录读写和可执行权限

    一 进入目录权限 如果我在普通用户下创建了一个目录f1 然后使用chomd u rwx g rwx o rwx之后 我在普通用户下想进入f1目录 权限不允许 然后我切换到超级用户下 再次尝试进入到f1目录 这个时候允许进入 然后回到普通用户
  • static的作用域

    一 面向过程设计中的static 1 静态全局变量 在全局变量前 加上关键字static 该变量就被定义成为一个静态全局变量 静态全局变量有以下特点 该变量在全局数据区分配内存 未经初始化的静态全局变量会被程序自动初始化为0 自动变量的值是
  • Linux下rgmii接口,zynq7010 petalinux 2019.2 RGMII via EMIO 连接问题

    各位好 遇到一个问题 petalinux 2019 2 zynq7010 通过gmii to rgmii 连接挂外EMIO管脚上的PHY kernel启动没有识别PHY的动作 在非linux环境下测试过网络是OK的 u boot下也能够正常
  • Gcc 编译时指定宏

    gcc 编译指定宏 那在makefile里面 gcc DMACRONAME MACRODEF 或者 gcc DMACRONAME 这样就定义了预处理宏 编译的时候可选代码就会被编译进去了 举例说明 Dmacro string 等价于在头文件
  • ubuntu16.04 安装 pygraphviz

    sudo apt get install python pydot python pydot ng graphviz graphviz dev sudo pip3 install pygraphviz
  • qt自定义控件设置属性

    自定义控件设置的属性出现在ui designer控件栏 参考 https blog csdn net Mingyueruya article details 121268933 主要是靠Q PROPERTY 定义一个QString类型 名字
  • C#入门-简介

    一 入门 1 简介 1 1 C 语言介绍 C 是一种新式编程语言 不仅面向对象 还类型安全 C 是面向对象的 面向组件的编程语言 多项 C 功能有助于创建可靠且持久的应用程序 垃圾回收自动回收不可访问的未用对象所占用的内存 可以为 null
  • 中标龙芯、deepin龙芯、ubuntu证书存放路径及安装卸载说明

    中标龙芯 deepin龙芯 ubuntu证书存放路径及安装卸载说明 一 Ubuntu deepin龙芯 证书路径 etc ssl certs ca certificates crt 安装步骤 1 生成 crt后缀证书 如test crt 2
  • fiddler抓包番外————了解工具栏

    前言 作为一款功能强大的工具 Fiddler 提供了许多实用的功能和工具栏 可以帮助用户更加高效地使用它 如果您想了解 Fiddler 的工具栏及其功能 那么本篇文章就是为您准备的 在这里 我将为大家详细介绍 Fiddler 的工具栏及其各
  • ubuntu linux 教程 pdf,Ubuntu 12.04 菜鸟完全使用教程(四) PDF

    Linux公社已经在先前发布Suruibin 同学制作的 Ubuntu 12 04 菜鸟使用手册一到三系列教程 看来 Suruibin 同学是要将这套教程进行到底了 Ubuntu 12 04 菜鸟使用手册 四 已经写好了 当我们面对一件繁杂
  • 主备延迟监控

    主备延迟的模拟 文章目录 主备延迟的模拟 1 基本工具的安装 1 1 安装 percona toolkit 1 2 安装 sysbench 2 搭建延迟监控 1 基本工具的安装 1 1 安装 percona toolkit 这玩意儿工具挺全
  • Java的jar包依赖版本冲突解决

    参考 https blog csdn net weixin 38898423 article details 128178055 https blog csdn net Yal insist article details 12766998
  • Student类,包括学生姓名、性别、年龄、Java成绩。要求创建五个该类对象,输出每个学生信息,计算并输出这五个学生Java成绩的平均值, 以及计算并输出他们Ja

    一 Student类 包括学生姓名 性别 年龄 Java成绩 要求创建五个该类对象 输出每个学生信息 计算并输出这五个学生Java成绩的平均值 以及计算并输出他们Java成绩的最高分以及最低分是多少 分别是哪位同学 public class
  • 推荐使用maven shade进行打包,assembly打包会出现若干问题

    现在基本上都是采用maven来进行开发管理 我有一个需求是需要把通过maven管理的java工程打成可执行的jar包 这样也就是说必需把工程依赖的jar包也一起打包 而使用maven默认的package命令构建的jar包中只包括了工程自身的
  • c#调用c++ dll的几种类型转换

    在合作开发时 C 时常需要调用C DLL 当传递参数时时常遇到问题 尤其是传递和返回字符串是 现总结一下 分享给大家 VC 中主要字符串类型为 LPSTR LPCSTR LPCTSTR string CString LPCWSTR LPWS