乘着还没有添加商业功能之前,先给大家把福利分享了

希望有需要的朋友能够用的上

这个框架是在用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 框架的更多相关文章

  1. Ligg.EasyWinApp-000: 一款Windows应用编程框架介绍

        本框架(解决方案)是一个Windows应用编程框架和UI库,通过该框架,不需任何代码,通过XML配置文件,搭建任意复杂的Windows应用界面,以类似Execel公式的方式实现基本的过程控制( ...

  2. 使用C语言编写windows服务一般框架

    原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...

  3. 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些

    WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...

  4. Python调用windows下DLL详解

    Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...

  5. 【Windows下DLL查找顺序 】

    一.写作初衷 在Windows下单个DLL可能存在多个不同的版本,若不特别指定DLL的绝对路径或使用其他手段指定,在应用程序加载DLL时可能会查找到错误的版本,进而引出各种莫名其妙的问题.本文主要考虑 ...

  6. Windows中DLL文件的意义及其作用

    Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...

  7. 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编辑器里用着还好好的,但是一导出就给我报错,让我十分不爽. 于是请教百度,搜出了五花八门的答案,没一个能解决我的问题的, ...

  8. Directx11 教程(2) 基本的windows应用程序框架(2)

    原文:Directx11 教程(2) 基本的windows应用程序框架(2)      在本教程中,我们把前面一个教程的代码,进行封装.把初始化函数,Run函数,窗口回调函数,ShutdownWind ...

  9. Directx11 教程(1) 基本的windows应用程序框架(1)

    原文:Directx11 教程(1) 基本的windows应用程序框架(1)        在vs2010中,建立一个新的win32工程,名字是: myTutorialD3D11, 注意:同时勾选Cr ...

随机推荐

  1. javascript与java正则表达式写法的区别

    Js验证写法:(转义符\) var str = "待验证文本"; var regular = new RegExp(/这里是正则表达式/); if (regular.test(st ...

  2. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

  3. .NET Core 中 IOptions 有什么用

    我只发现IOptions的一个用处——方便了在.NET Core应用程序中使用强类型配置. 如果没有IOptions,使用强类型配置需要自己解决下面2个问题: 1)将配置文件(比如appsetting ...

  4. vins-mono代码解读

    系统框架介绍 1. Measurement Preprocessing(观测预处理):对图像提feature做feature tracking,输出tracked feature list, 对IMU ...

  5. Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...

  6. Installing Precise (12.04.2) using netboot onto a Marvell ArmadaXP Development Board

      https://wiki.ubuntu.com/ARM/Server/Install https://wiki.ubuntu.com/ARM/Server/Install/ArmadaXP Arm ...

  7. URL编码问题

    一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号. 比如,世界上有英文字母的网址"http://www.abc.com", 但是没有希腊字母的网址 ...

  8. Chap8:加密货币TOP100[《区块链中文词典》维京&甲子]

    根据2018年1月15日CoinMarketCap的加密货币市值排名编写,这里介绍TOP10,具体请参考<区块链中文词典>维京&甲子 01.比特币/Bitcoin/BTC 一种点对 ...

  9. [daily][pcaman] pacman滚动升级跳过指定包

    有时候有些包是坏的,  我们在Syu的时候,想把它跳过去. 可以在pacman.conf 中使用如下选项: IgnorePkg=linux https://wiki.archlinux.org/ind ...

  10. visual stodio 编译前后动作定制总结

    copy "$(TargetDir)$(TargetName).lib" ..\lib\deploy\$(TargetName).lib 编译完成后将一个.lib 文件拷贝到指定目 ...