为了账号安全,请及时绑定邮箱和手机立即绑定

syscall.MustLoadDll.MustFindProc 抛出“找不到指定的过程”

syscall.MustLoadDll.MustFindProc 抛出“找不到指定的过程”

Go
SMILET 2023-05-15 15:06:47
我用 C++ 编写了一个动态链接库并正确导出它,以便 Go 能够使用 Win32 API 获取适配器信息。但是当我在 Go 中调用它的函数时,它抛出“找不到指定的过程”错误。我是 Go 的新手,所以我不知道如何解决它。有人可以帮助我吗?这是有关我的环境的一些信息:平台:windows 10 x64CXX 编译器:visual c++ 15.3去版本:go1.11.2 windows/amd64这是我的代码:#include "stdafx.h"#include <WinSock2.h>#include <iphlpapi.h>#include <iostream>#include <vector>using namespace std;__declspec(dllexport) const char *get_default_gateway();vector <string> default_gateway;const char *get_default_gateway(){    PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();    PIP_ADAPTER_INFO info_p;    unsigned long stSize = sizeof(IP_ADAPTER_INFO);    int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);    info_p = pIpAdapterInfo;    if (ERROR_BUFFER_OVERFLOW == nRel)    {        delete pIpAdapterInfo;            pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];            nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);        info_p = pIpAdapterInfo;    }    if (ERROR_SUCCESS == nRel)    {            while (info_p)        {                    IP_ADDR_STRING *pIpAddrString = &(info_p->IpAddressList);            do            {                string gateway_tmp = info_p->GatewayList.IpAddress.String;                if (gateway_tmp != "0.0.0.0") {                    default_gateway.push_back(info_p->GatewayList.IpAddress.String);                }                pIpAddrString = pIpAddrString->Next;            } while (pIpAddrString);            info_p = info_p->Next;        }    }    if (pIpAdapterInfo)    {        delete []pIpAdapterInfo;    }    const char *gateway = default_gateway.at(0).c_str();    return gateway;}
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

很有可能您遇到了 C++ 编译器对导出函数的名称应用名称修改的影响,因此它实际上并没有按照您在库的导出表中期望的方式命名。您可以使用 objdump 或古老的depends.exe. 最简单的方法是将导出函数的声明包装到extern "C" { ... }—复习一下。


查看完整回答
反对 回复 2023-05-15
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信