C++ GUI 程序如何调用 golang 生成的 DLL - V2EX
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 5016 次点击
    这是一个创建于 2304 天前的主题,其中的信息可能已经有所发展或是发生改变。

    只针对 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     Solana     5508 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:28 PVG 09:28 LAX 18:28 JFK 21:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86