go 调用winapi_golang 调用windows API 中文的处理
Go语言发展势头很猛,其实缺点也很多,好在有广大爱好者提供了无数的库,把优点表现得太好了,搞得什么都是拿来就使用,基本完全不理会指针,性能还不错。
最近在windows下使用遇到一个中文的问题,首先要了解的是Golang的编码是utf-8的,而中文windows的API返回时多字节的GBK编码。
下面是利用API 获得进程的示例,代码是网上的,但是使用时出现了,当进程名是中文时出现的乱码问题。
先贴代码。
package utilities
import (
"bytes"
"io"
"log"
"net/http"
"sort"
"strconv"
"strings"
"syscall"
//"unicode/utf8"
"unsafe"
"github.com/axgle/mahonia"
)
type ulong int32
type ulong_ptr uintptr
type PROCESSENTRY32 struct {
dwSize ulong
cntUsage ulong
th32ProcessID ulong
th32DefaultHeapID ulong_ptr
th32ModuleID ulong
cntThreads ulong
th32ParentProcessID ulong
pcPriClassBase ulong
dwFlags ulong
szExeFile [260]byte
}
type ProcessStruct struct {
processName string // 进程名称
processID int // 进程id
}
type ProcessStructSlice []ProcessStruct
func (a ProcessStructSlice) Len() int { // 重写 Len() 方法
return len(a)
}
func (a ProcessStructSlice) Swap(i, j int) { // 重写 Swap() 方法
a[i], a[j] = a[j], a[i]
}
func (a ProcessStructSlice) Less(i, j int) bool { // 重写 Less() 方法, 从大到小排序
if strings.Compare(a[j].processName, a[i].processName) < 0 {
return true
} else {
return false
}
}
func Upayin_process(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
_, err := r.Form["callsys"]
if !err {
io.WriteString(w, "err")
return
}
kernel32 := syscall.NewLazyDLL("kernel32.dll")
CreateToolhelp32Snapshot := kernel32.NewProc("CreateToolhelp32Snapshot")
pHandle, _, _ := CreateToolhelp32Snapshot.Call(uintptr(0x2), uintptr(0x0))
if int(pHandle) == -1 {
io.WriteString(w, "get process err")
return
}
var data []ProcessStruct
var buffer bytes.Buffer
decoder := mahonia.NewDecoder("gbk")
Process32Next := kernel32.NewProc("Process32Next")
for {
var proc PROCESSENTRY32
proc.dwSize = ulong(unsafe.Sizeof(proc))
if rt, _, _ := Process32Next.Call(uintptr(pHandle), uintptr(unsafe.Pointer(&proc))); int(rt) == 1 {
len_szExeFile := 0
for _, b := range proc.szExeFile {
if b == 0 {
break
}
len_szExeFile++
}
var bytetest []byte = []byte(proc.szExeFile[:len_szExeFile])
_, newdata, newerr := decoder.Translate(bytetest, true)
if newerr != nil {
log.Println(newerr)
}
data = append(data, ProcessStruct{
processName: string(newdata),
processID: int(proc.th32ProcessID),
})
} else {
break
}
}
CloseHandle := kernel32.NewProc("CloseHandle")
_, _, _ = CloseHandle.Call(pHandle)
sort.Sort(ProcessStructSlice(data))
for _, v := range data {
log.Println(v.processName)
buffer.WriteString("ProcessName : ")
buffer.WriteString(v.processName)
buffer.WriteString(" ProcessID : ")
buffer.WriteString(strconv.Itoa(v.processID))
buffer.WriteString("\n")
}
io.WriteString(w, buffer.String())
}
重要的是
"github.com/axgle/mahonia" //这个库
decoder := mahonia.NewDecoder("gbk")
//gbk转utf8
var bytetest []byte = []byte(proc.szExeFile[:len_szExeFile])
_, newdata, newerr := decoder.Translate(bytetest, true)
其实里面做了判断,并不是单纯的使用utf8.EncodeRune来解决,刚开始我也是直接使用utf8这个库来尝试,没成功.
在这里做个分享,呵呵
go 调用winapi_golang 调用windows API 中文的处理相关推荐
- delphi调用windows api
在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成).单元Windows.pas 已经由 ...
- C#中调用Windows API时的数据类型对应关系
C#中调用Windows API时的数据类型对应关系 原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE ...
- C#调用windows api的要点
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- C#中调用Windows API的要点
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- 用C#调用Windows API向指定窗口发送按键消息
为什么80%的码农都做不了架构师?>>> 用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入 ...
- 善于 调用Windows API
前一段时间看见别人做的一个自动填写信息并且点击登录的程序,觉得很有意思. 其实就是在程序中调用Windows的API,那么如何调用,下面就做个简单的介绍. 写的简单粗暴, 不喜轻喷. 0.首先引入名称 ...
- C#中调用Windows API的要点【转载】
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- 在C#中调用windows API函数
Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...
- [收集]Visual C#中调用Windows API
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
最新文章
- 厌倦了“正在输入…”的客服对话,是时候pick视频客服了
- PowerBI从SCCM数据库中分析数据和KPI展现
- 线程(Thread,ThreadPool)、Task、Parallel
- pip安装 tensorflow-gpu 提示Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
- php语言设计图书管理系统,图书馆管理系统PHP版_7tmu7b
- 使用try-with-resources替代try finally释放资源
- jeecg-mybatis-framework 参考学习版本
- 《深入浅出DPDK》读书笔记(八):网卡性能优化(异步中断模式、轮询模式、混和中断轮询模式)
- (项目)生鲜超市(六)
- java生成excel中文乱码,JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)...
- Ajax基础之原生js封装
- STM32 f103 实现命令终端
- Qt处理图片背景为透明色
- 初中计算机教案ps,初中信息技术《认识Photoshop CS2的工作界面》教案
- LT8618SXB-HDMI发射器,运行功率小于100mA播放24bit 1080P内容,待机功率小于2mA
- 技术日记2021/2/12 “牛气飞天”恶作剧
- 屏蔽网站、网页和弹窗的方法
- MySQL必知必会——实践习题
- 牛客java选择题每日打卡Day12
- 因IP被列入黑名单导致U-Mail被退信的处理方法
热门文章
- 币知识——比特币现金
- jQuery通过name获取值
- mysql导入导出sql文件
- PostgreSQL 打开文件句柄优化 - 百万以上实体对象初始化优化
- Blend4精选案例图解教程(三):一键拖拽
- Virtura box 构建一个简单局域网并联入外网
- 图形旋转的C语言源程序
- centos7下安装docker(14安装docker machine​)
- 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
- 我的angularjs源码学习之旅2——依赖注入