C#高阶与初心:(二)P/Invoke平台调用
最近某个项目要采集交易终端的信息用于监管,主要厂商给出了API,C++版的。。。开启hard模式!!!
C#调用C++的DLL基本就两种方法:加一个VC++项目包一层,或者使用P/Invoke(平台调用)。前者对于纯C#的客户端来说,增加了复杂性。那就只剩下平台调用了。使用平台调用的过程比较艰辛,主要遇到了两个问题:1、调用方式CallingConvention;2、参数类型;
调用方式默认貌似StdCall,如果调用Windows API,可以不写;但是对于C风格的,呵呵,得写成Cdecl。如果没写的话 ,内心肯定是崩溃的。。。为什么结果总是不对!!!
好日子过久了,就吃不了苦啦。。。在.Net框架下,基础数据类型的使用随手拈来,从来不会发生不知道怎么用的情况:数字就int,字符串就string,考究一点考虑考虑long和StringBuilder。一弄平台调用,傻眼了,这该用啥数据类型呢?!
函数的原型是GetSystemInfo(char* pSystemInfo, int& nLen),后一个参数知道是要传入一个ref int,前一个呢?同事告诉我可以使用string,但是问题是,需要传出([Out]),字符串都是不可更改的。谷歌一下,有说可以StringBuilder的,试试貌似好使(后来看到Learning Hard以及微软自己的文档,StringBuilder确实可以)。
但又遇到了问题——其中一家的API取出的字符串比len更长的部分是乱码(后来想其实可以截断)?!我司一位C++大佬给了条明路,可以使用byte[],试试,中!这才落定。
后来看了很多博客和微软的文档,数据封送(支持平台调用和COM)是一门技术,光说明都很多页。主要的内容是数据封送拆收器(Marshaler),对于数据在托管内存和非托管内存中的传递。图示如下:
C#高阶与初心:(二)P/Invoke平台调用的更多相关文章
- python六十四课——高阶函数练习题(二)
总结:高阶函数以及匿名函数之间的配合使用 from functools import reduce #模块一:lambda和filter的结合使用 #lt = [1,2,3,4,5,6,7,8,9] ...
- react之高阶组件(二)
高阶组件的使用 接上文———— 一.像函数一样直接调用 import React, { Component } from 'react' import A from './A' class C ext ...
- Python笔记_第四篇_高阶编程_二次封装
1.二次封装: 二次封装其实就是对一个类或者一个方法进行二次的改造增加新的功能. 2.一个类的二次封装: 我们以一个进程为例,我们把Process这个库进行二次封装,增加一些功能,在调用. thoma ...
- C#高阶与初心:(一)List.Add添加的到底是什么?
前几日与同事讨论一个相对复杂的场景,需要先将中间过程存储在List中,稍后再用.同时程序类的许多线程共用了一个全局变量. 具体来说就是如下代码 ... _order = order1; _list.A ...
- React.js高阶函数的定义与使用
/* 高阶函数的简单定义与使用 一: 先定义一个普通组件 二: 用function higherOrder(WrappendComponent) { return } 将组件包裹起来,并用export ...
- Kotlin——高级篇(二):高阶函数详解与标准的高阶函数使用
在上面一个章节中,详细的讲解了Kotlin中关于Lambda表达式的语法以及运用,如果还您对其还不甚理解,请参见Kotlin--高级篇(一):Lambda表达式详解.在这篇文章中,多次提到了Kotli ...
- 初学 Python(十二)——高阶函数
初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...
- python六十二课——高阶函数之filter
高阶函数之:filter函数:过滤数据的,最终返回一个惰性序列对象(filter对象,迭代器对象)解释:filter的意思:在计算机领域中我们都称为过滤器格式:filter(fn,lsd):参数和ma ...
- Scala学习十二——高阶函数
一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...
随机推荐
- [android开发篇]项目目录结构
- TOJ 5065: 最长连续子序列
5065: 最长连续子序列 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 140 ...
- TMOS_Order_of_Operations_v0.1
- (转)新ITC提交APP常见问题与解决方法(Icon Alpha,Build version,AppIcon120x120)(2014-11-17)
1)ICON无法上传,提示图片透明(有Alpha通道) 苹果现在不接受png里的Alpha了,提交的图标带有Alpha通道就提示: 简单处理:用自带的预览打开,导出时不勾选Alpha,仍保存为png格 ...
- BZOJ 1027 [JSOI2007]合金 ——计算几何
我们可以把每一种金属拆成一个二维向量,显然第三维可以计算出来,是无关的. 我们只需要考虑前两维的情况,显然可以构成点集所形成的凸包内. 然后我们枚举两两的情况,然后可以发现如果所有的点都在一侧是可以选 ...
- [luoguP3172] [CQOI2015]选数(递推+容斥原理)
传送门 不会莫比乌斯反演,不会递推. 但是我会看题解. 先将区间[L,H]变成(L-1,H],这样方便处理 然后求这个区间内gcd为k的方案数 就是求区间((L-1)/k,H/k]中gcd为1的方案数 ...
- 火柴排队(codevs 3286)
题目描述 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度.现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中 ai表示第一列 ...
- windows bat语法
@echo off 表示在这条语句之后,所有执行命令的语句不会显示 setLocal 参考1 rem 注释 :或者:: 参考 set /p 等待用户输入 SET /A express ...
- Lucene 6.5.0 入门Demo
Lucene 6.5.0 要求jdk 1.8 1.目录结构: 2.数据库环境: private int id; private String name; private float price; pr ...
- 前端跨域调请求 nginx反向代理
用 本地pc的目录,请求192.168.3.246的接口,以/api为标识 运行命令: 启动 nginx -s start 重启 nginx -s relaod 停止 nginx -s stop 查看 ...