windows go dll 框架
乘着还没有添加商业功能之前,先给大家把福利分享了
希望有需要的朋友能够用的上
这个框架是在用windows平台,GO做的http/https服务,调用dll现有的库接口实现特定功能的大框架
//dll
//现有库不能直接使用,必须要有一个代理库,这个必要性,我想大家都清楚
//XSKFCSPEnroll是我司商业库,这个就不能让诸位浏览了,大家都能理解
//Enroll库是代理库
//我们以获得调用的商业库版本为例来阐述
//Enroll.h
#ifndef _ENROLL_
#define _ENROLL_
# ifdef ENROLL
# define Export _declspec(dllexport)
# else
# define Export _declspec(dllimport)
# endif
extern "C" {
Export int getHandle(void** pEnrollHandle, void** pLibHandle);
Export int releaseHandle(void** pEnrollHandle, void** pLibHandle);
Export int freeMem(void** pEnrollHandle, void** pLibHandle, void** p);
Export int getVersion(void** pEnrollHandle, void** pLibHandle, char** ver);
}
#endif
//Enroll.cpp
#include "stdafx.h"
#define ENROLL
#include "Enroll.h"
#include "app_util.h"
Export int getHandle(void** pEnrollHandle, void** pLibHandle)
{
HMODULE handle = LoadLibrary("XSKFCSPEnroll.dll");
if (handle)
{
typedef void*(*F)();
F f = (F)GetProcAddress(handle, "getLibraryHandle");
if (!f)
{
FreeLibrary(handle);
}
else
{
void* libhandle = f();
if (!libhandle)
{
FreeLibrary(handle);
}
else
{
*pEnrollHandle = handle;
*pLibHandle = libhandle;
return 1;
}
}
}
return 0;
}
Export int releaseHandle(void** pEnrollHandle, void** pLibHandle)
{
if (pEnrollHandle && pLibHandle)
{
typedef void(*F)(void*);
F f = (F)GetProcAddress((HMODULE)*pEnrollHandle, "releaseLibraryHandle");
if (!f)
{
FreeLibrary((HMODULE)*pEnrollHandle);
}
else
{
f(*pLibHandle);
FreeLibrary((HMODULE)*pEnrollHandle);
return 1;
}
}
return 0;
}
Export int freeMem(void** pEnrollHandle, void** pLibHandle, void** p)
{
if (p&&(*p))
{
free(*p);
return 1;
}
return 0;
}
Export int getVersion(void** pEnrollHandle, void** pLibHandle, char** ver)
{
if (pEnrollHandle && pLibHandle)
{
typedef HRESULT (*F)(void*, BSTR*);
F f = (F)GetProcAddress((HMODULE)*pEnrollHandle, "get_Version");
if (f)
{
CComBSTR ret;
if (S_OK==f(*pLibHandle, &ret))
{
CMemBlock<char> c_ret = CUtf8Unicode::f8UStringConvert(ret);
*ver = (char*)malloc(c_ret.GetSize());
if (*ver)
{
memcpy(*ver, c_ret, c_ret.GetSize());
return 1;
}
}
}
}
return 0;
}
//Enroll_Server.go
// 支持http/https
//遗留问题:服务如何退出,现在我还不知道
package main
import (
"fmt"
"os"
"net/http"
"Enroll_lib"
//"encoding/json"
)
var w32_handle Enroll_lib.Win32_handle
func init() {
fmt.Println("init")
var pw32 *Enroll_lib.Win32_handle = &w32_handle
res := pw32.LoadLib()
if !res {
fmt.Println("Load library failure")
}
res = pw32.GetHandle()
if !res {
fmt.Println("GetHandle failure")
}
//demo
fmt.Println("Version: ", pw32.GetVersion())
}
func entry(res http.ResponseWriter, req *http.Request) {
fmt.Fprintf(res, "Hello World!\n")
}
func main() {
Port := "8086"
IsHttp := true
arg_num := len(os.Args)
if 2<=arg_num {
Port = os.Args[1]
}
if 3<=arg_num {
if os.Args[2]=="true" {
IsHttp = true
} else {
IsHttp = false
}
}
fmt.Printf("server is http %t\n", IsHttp)
fmt.Println("server listens at ", Port)
http.HandleFunc("/", entry)
var err error
if IsHttp {
err = http.ListenAndServe(":"+Port, nil)
} else {
err = http.ListenAndServeTLS(":"+Port, "server.crt", "server.key", nil)
}
if err != nil {
fmt.Println("Server failure /// ", err)
}
w32_handle.FreeLib();
fmt.Println("quit");
}
//libs
//自开发的Go库
package Enroll_lib
import(
"fmt"
"syscall"
"C"
"unsafe"
)
type Win32_handle struct {
handle syscall.Handle
c_enroll_handle uintptr
c_lib_handle uintptr
err error
}
func (h *Win32_handle) LoadLib() bool {
h.handle, h.err = syscall.LoadLibrary("Enroll.dll")
if h.err!=nil {
fmt.Println("Enroll.dll not found")
return false
}
return true
}
func (h *Win32_handle) FreeLib() {
syscall.FreeLibrary(h.handle)
}
func (h *Win32_handle) GetHandle() bool{
getHandle, err := syscall.GetProcAddress(h.handle, "getHandle")
if err!=nil {
fmt.Println("getHandle not found")
return false
}
r,_,retstr := syscall.Syscall(uintptr(getHandle), 3, uintptr(unsafe.Pointer(&h.c_enroll_handle)),
uintptr(unsafe.Pointer(&h.c_lib_handle)),
0)
fmt.Println(retstr);
if r==0 {
fmt.Println("syscall failuer at getHandle")
return false
}
return true
}
func (h *Win32_handle) ReleaseHandle() {
releaseHandle, err := syscall.GetProcAddress(h.handle, "ReleaseHandle")
if err!=nil {
fmt.Println("releaseHandle not found")
}
r,_,retstr := syscall.Syscall(uintptr(releaseHandle), 3, uintptr(unsafe.Pointer(&h.c_enroll_handle)),
uintptr(unsafe.Pointer(&h.c_lib_handle)),
0)
fmt.Println(retstr)
if r==0 {
fmt.Println("syscall failuer at releaseHandle")
}
}
func (h *Win32_handle) FreeMem(p *C.char) {
freeMem, err := syscall.GetProcAddress(h.handle, "freeMem")
if err!=nil {
fmt.Println("freeMem not found")
}
r,_,retstr := syscall.Syscall(uintptr(freeMem), 3, uintptr(unsafe.Pointer(&h.c_enroll_handle)),
uintptr(unsafe.Pointer(&h.c_lib_handle)),
uintptr(unsafe.Pointer(&p)))
fmt.Println(retstr)
if r==0 {
fmt.Println("syscall failuer at freeMem")
}
}
func (h *Win32_handle) GetVersion() string {
getVersion, err := syscall.GetProcAddress(h.handle, "getVersion")
if err!=nil {
fmt.Println("getVersionm not found")
}
var p *C.char
r,_,retstr := syscall.Syscall(uintptr(getVersion), 3, uintptr(unsafe.Pointer(&h.c_enroll_handle)),
uintptr(unsafe.Pointer(&h.c_lib_handle)),
uintptr(unsafe.Pointer(&p)))
fmt.Println(retstr)
if r==0 {
fmt.Println("syscall failure at getVersion")
}
defer h.FreeMem(p)
return C.GoString(p)
}
//现场
//结果-https
Finally:
大家是不是迫不及待的想GO了,如果是,那我很欣慰!
本系列Go讲解暂时得告一段落啦
其实,我真心希望,Go&C能够一统江湖,让其它那些乱七八糟的语言自然衰老去dead
哈哈哈哈哈,上边这句你就当笑话听吧!权当我没说
不听才怪!哈哈哈
劝告:
1. 永远不要说自己的结论和推论的正确性
2. 伯乐只有一个,可惜不是你
3. 客观,唯物,在同事实践中,你才能知道一个人到底行不行
最后,祝大家Go(滚)的顺溜!哈哈哈
windows go dll 框架的更多相关文章
- Ligg.EasyWinApp-000: 一款Windows应用编程框架介绍
本框架(解决方案)是一个Windows应用编程框架和UI库,通过该框架,不需任何代码,通过XML配置文件,搭建任意复杂的Windows应用界面,以类似Execel公式的方式实现基本的过程控制( ...
- 使用C语言编写windows服务一般框架
原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...
- 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些
WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- 【Windows下DLL查找顺序 】
一.写作初衷 在Windows下单个DLL可能存在多个不同的版本,若不特别指定DLL的绝对路径或使用其他手段指定,在应用程序加载DLL时可能会查找到错误的版本,进而引出各种莫名其妙的问题.本文主要考虑 ...
- Windows中DLL文件的意义及其作用
Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...
- ArgumentException: The Assembly Mono.WebBrowser is referenced by System.Windows.Forms ('Assets/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.
最近有个项目要用到System.Windows.Forms.dll,在Unity编辑器里用着还好好的,但是一导出就给我报错,让我十分不爽. 于是请教百度,搜出了五花八门的答案,没一个能解决我的问题的, ...
- Directx11 教程(2) 基本的windows应用程序框架(2)
原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把初始化函数,Run函数,窗口回调函数,ShutdownWind ...
- Directx11 教程(1) 基本的windows应用程序框架(1)
原文:Directx11 教程(1) 基本的windows应用程序框架(1) 在vs2010中,建立一个新的win32工程,名字是: myTutorialD3D11, 注意:同时勾选Cr ...
随机推荐
- ELK之使用metricbeat收集系统数据及其他程序并生成可视化图表
将 Metricbeat 部署到您所有的 Linux.Windows 和 Mac 主机,并将它连接到 Elasticsearch 就大功告成啦:您可以获取系统级的 CPU 使用率.内存.文件系统.磁盘 ...
- 秒秒钟提高办公技巧的6个Excel技巧
一.职工身份证号码是否登记重复(=IF(COUNTIF(B2:B13,B2&"*")>1,"重复","")) 职工列表人数众多 ...
- API(三)之Class-based Views
使用基于类的视图重写API 我们首先将根视图重写为基于类的视图.所有这一切都涉及到重构views.py. from snippets.models import Snippet from snippe ...
- 搭桥|codevs1002|最小生成树|Prim|并查集|Elena
1002 搭桥 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点 ...
- shell技巧之以逆序形式打印行
测试文本内容如下: # cat textfile hadoop hdfs yarn spark zookeeper mapreduce hive hbase scala kafka CHAVIN my ...
- 图的遍历算法:DFS、BFS
在图的基本算法中,最初需要接触的就是图的遍历算法,根据访问节点的顺序,可分为深度优先搜索(DFS)和广度优先搜索(BFS). DFS(深度优先搜索)算法 Depth-First-Search 深度优先 ...
- Vue SSR 配合Java的Javascript引擎j2v8实现服务端渲染2创建Vue2+webpack4项目
前提 安装好nodejs并配置好环境变量,最好是 node10,https://nodejs.org/en/download/ 参考我之前的文章 debian安装nodejs Yarn &&a ...
- 关于nginx重新编译
nginx安装成功后,发现有一些其他模块没有编译进去,或者想额外添加一些模块,这时候就要重新编译nginx. 首先,查看之前编译的一些参数,比如: 1 2 3 4 5 [root@lmode ngin ...
- jcgrid
1.jcgrid实现 <span class="JcGrid" id="MyGrid" listdata="Rds.List.UserList& ...
- Server:www121 Server:www120 Server:NWS_SP
Request URL:http://www.biyao.com/minisite/bzzx Request Method:GET Status Code:200 OK Remote Address: ...