惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
S
Securelist
D
Docker
The Register - Security
The Register - Security
GbyAI
GbyAI
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
罗磊的独立博客
博客园 - 【当耐特】
F
Full Disclosure
WordPress大学
WordPress大学
腾讯CDC
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
I
InfoQ
MyScale Blog
MyScale Blog
量子位
Cyberwarzone
Cyberwarzone
博客园 - 三生石上(FineUI控件)
The Hacker News
The Hacker News
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园_首页
H
Help Net Security
K
Kaspersky official blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Webroot Blog
Webroot Blog
Blog — PlanetScale
Blog — PlanetScale
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
The Cloudflare Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
爱范儿
爱范儿
P
Privacy International News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed

博客园 - MainIsUsed

svg札记 rabbitmq 小记 nfc相关 MI卡UID oracle9i导入导出命令 (转)C++中指针和引用的区别 .net下的office开发(visio对象) 关于DataTable的GetChanges()方法 【转】C#中的非安全编程(key:unsafe,fixed) Oracle中UTL_FILE包的UTL_FILE.FOPEN用法 URL字符串编码 笔记HTML - MainIsUsed - 博客园 .net导出为powerpoint的一些参考代码 关于ClickOnce 发布过程中的错误:要求高版本的CAPICOM.dll Oracle EXTRACT()函数与to_char() 函数 c#接口使用方法 - MainIsUsed - 博客园 在 WinForm 中完整支持在多级目录中保存的 ASP.NET (转) - MainIsUsed (转)实现基于事件通知的.Net套接字 (转)什么是套接字(Socket)?
c# 获取串口设备的输入(unsigned char *和 char*)
MainIsUsed · 2009-05-31 · via 博客园 - MainIsUsed

因为是C#,所以平台肯定是.NET了。

之前因为一个小小的业务需要接触了下密码键盘的操作。其实就是简单的获取用户输入密码的操作,没碰到什么大的问题,但是查资料的过程中还是感觉查到的东西挺多的,是那种越查越多,但是又不是很关键的东西。

在调用DLL中的方法的时候,我们一般要对照函数说明来把C/C++中的类型转换为.NET中相对应的类型,而且方法必须声明为静态外部函数,即加上public  extern static声明头.如果不加public ,函数默认为私有函数,调用就会出错。

[DllImport("COM DLL path/file")]

public extern static int FunctionName(byte param1, ushort param2)

类型对照表:

Win32 Types

CLR Type

char, INT8, SBYTE, CHAR 

System.SByte

short, short int, INT16, SHORT

System.Int16

int, long, long int, INT32, LONG32, BOOL , INT

System.Int32

__int64, INT64, LONGLONG

System.Int64

unsigned char, UINT8, UCHAR , BYTE

System.Byte

unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t

System.UInt16

unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT

System.UInt32

unsigned __int64, UINT64, DWORDLONG, ULONGLONG

System.UInt64

float, FLOAT

System.Single

double, long double, DOUBLE

System.Double

 对于普通的函数调用一般类型对应上就没什么问题了,但是对于涉及到指针操作和回调操作的就会复杂一些,当然熟悉了也就不复杂了,这里只涉及指针的操作。

如果DLL中有一个函数的传人参数是一个指针的话,如:

int __stdcall FunctionName(unsigned char *param2)这就当是DLL的一个函数说明,返回值是INT,传入参数是一个指针,类型是unsigned char。对于CHAR和STRING类型的区别本来找到个说的比较好的文章,但是回到家里后就找不到那文章了。他们的区别就是字符和字符串的区别,char 声明并赋值的时候只能是单字符的,char c = 'c';而string声明和赋值的时候可以是单字符也可以是很多个单字符连在一起组成一个串,string s = "cc";C/C++在表示字符串的时候是以字符数组来表示的,char[] c;

在调用包括指针操作的函数的时候,除了对照类型,我们还得考虑采用的处理方式。 “对于这种情况可以使用C#提供的非安全代码来进行解决,但是,毕竟是非托管代码,垃圾资源处理不好的话对应用程序是很不利的。所以还是使用C#提供的ref以及out修饰字比较好。”

非安全代码是.NET为了指针操作的需要而特别设置的功能,所以既然是针对指针而留的,那应该也是最合适的处理方法了。后面试了下ref的方式,提示实例的异常,也许是指针传的不对,找不到对象了。

使用:已密码键盘获取密码输入为例

函数说明:int __stdcall inputpassword(unsigned char *param)

.NET中使用:

声明:

[DllImport("COM DLL path/file")]
unsafe public static extern int inputpassword(byte* param);这里我们用BYTE对应char*

调用:放在哪里自己决定

byte[]  password = new byte[6];\\密码键盘输入为6位,所以长度设为6就可以了

unsafe

{

   //fixed的MSDNhttp://msdn.microsoft.com/zh-cn/library/f58wzh21(VS.80).aspx

    fixed(byte* array=password ) //这里获取的是password 的地址,并FIX,就是固定“fixed 语句禁止垃圾回收器重定位可移动的变量”

    {

        int ret_value = inputpassword(array);//这里传入的是指针,因为unsigned char *param就是一个指针。

    }

}

语句执行后的结果是输入的密码会保存在password 字节数组中,之后就是调用相应的方法把password 转换成6位密码字符了。