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

我用 C++ 编写了一个动态链接库并正确导出它,以便 Go 能够使用 Win32 API 获取适配器信息。但是当我在 Go 中调用它的函数时,它抛出“找不到指定的过程”错误。我是 Go 的新手,所以我不知道如何解决它。有人可以帮助我吗?

这是有关我的环境的一些信息:

平台:windows 10 x64

CXX 编译器: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;

}


SMILET
浏览 179回答 1
1回答

犯罪嫌疑人X

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

相关分类

Go