V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
mainjzb
V2EX  ›  Go 编程语言

C++ GUI 程序如何调用 golang 生成的 DLL

  •  
  •   mainjzb · 2019-06-22 11:23:29 +08:00 · 4758 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    只针对 Windows, 我把 brook 编译成 dll 给我的 C++写的 GUI 程序调用,Golang 编译成 dll 没有什么问题。C++也能调用。

    但是如果我 C++程序选择使用使用窗口,不用控制台模式,调用就不行了。如何修改 brook,让他被 GUI 程序调用。

    第 1 条附言  ·  2019-06-22 12:15:39 +08:00
    下载 Brook 的源码,稍微修改 Brook 的 main 函数,加入一个传入参数( string ),函数名为 bkvpn(string);
    使用命令生成 main.dll main.h
    go build -o main.dll -buildmode=c-shared

    然后在 Visual Studio 里运行一个 C++的 GUI 程序并调用
    如果在项目属性->链接器->子系统-> "控制台”
    则程序正常运行。

    如果在项目属性->链接器->子系统-> "窗口”
    则程序运行到 bkvpn()里面,程序则直接退出,没有任何提示。C++后面的代码也不执行了
    第 2 条附言  ·  2019-06-22 12:19:15 +08:00
    //C++ 代码 main.c
    #include <stdlib.h>
    #include <windows.h>
    #include "main.h"


    typedef void (*bkvpn)(GoMem*);


    int main() {
    HMODULE hdll = LoadLibrary("main.dll");

    KDVPN bkvpn = (KDVPN)GetProcAddress(hdll, "bkvpn");


    GoMem gm;

    char * a = "main.exe vpn -l 127.0.0.1:1085 -s 1.1.1.1:850 -p 12345678x";
    gm.data = a;
    gm.size = 58;

    KdVpn(&gm);
    }
    第 3 条附言  ·  2019-06-22 12:22:21 +08:00
    //上面有些错了重新贴一下
    //C++ 代码 main.c
    #include <stdlib.h>
    #include <windows.h>
    #include "main.h"


    typedef void (*bkvpn)(GoMem*);


    int main() {
    HMODULE hdll = LoadLibrary("main.dll");

    BKVPN bkvpn = (BKVPN )GetProcAddress(hdll, "bkvpn");


    GoMem gm;

    char * a = "main vpn -l 127.0.0.1:1085 -s 1.1.1.1:850 -p 12345678x";
    gm.data = a;
    gm.size = 58;

    bkvpn(&gm);
    }
    6 条回复    2019-06-22 19:16:03 +08:00
    iwong0exv2
        1
    iwong0exv2  
       2019-06-22 11:31:06 +08:00 via Android
    调用不行是什么意思?
    加载 DLL 的方式是静态链接还是动态地 LoadLibrary ?
    编译、链接还是运行时有问题?有没有错误代码或提示?
    zycpp
        2
    zycpp  
       2019-06-22 11:55:14 +08:00 via iPhone
    静态编译不行吗?
    可以先用 dumpbin 看下依赖
    mainjzb
        3
    mainjzb  
    OP
       2019-06-22 12:09:02 +08:00
    @iwong0exv2 动态。
    运行时,运行到 dll 的函数里里面,直接整个程序退出了。没有错误提示。
    zwh2698
        4
    zwh2698  
       2019-06-22 12:35:02 +08:00 via Android
    运行期库可能不对,调试器可以捕获具体情况
    zwh2698
        5
    zwh2698  
       2019-06-22 12:37:46 +08:00 via Android
    另外不要导出这种 string 的函数,因为存在内存在不同运行期释放的问题,就裸内存传
    stephen9357
        6
    stephen9357  
       2019-06-22 19:16:03 +08:00
    估计是崩了,不要跨模块传递 string、STL 容器之类的对象,一旦涉及内存分配或释放就会崩掉了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2728 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 03:54 · PVG 11:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.