欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang 调用windows API 中文的处理

程序员文章站 2022-04-24 19:05:56
Go语言发展势头很猛,其实缺点也很多,好在有广大爱好者提供了无数的库,把优点表现得太好了,搞得什么都是拿来就使用,基本完全不理会指针,性能还不错。 最近在windows下使用遇到一个中文的问题,首先要了解的是Golang的编码是utf-8的,而中文windows的API返回时多字节的GBK编码。 下 ......

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这个库来尝试,没成功.

在这里做个分享,呵呵