繁体   English   中英

使用 LoadLibrary() 和 GetProcAddress 从 DLL 调用函数

[英]Calling functions from a DLL using LoadLibrary() and GetProcAddress

我对 C++ 和视觉工作室很陌生,我一直在努力解决这个问题。 我有 2 个已成功加载的 DLL 文件。我没有任何一个 DLL 文件的头文件或 .lib 文件,因为我只获得了 .dll 文件。 我想使用Arti DLL 中的EstablishConnection()函数。 但是,每当我在构建代码后执行代码时,我总是得到相同的结果,这是我的错误检查告诉我无法找到该函数。 任何关于我做错了什么的建议将不胜感激。

这是我写的 main.cpp:

#include "windows.h"
#include <iostream>
#include "libloaderapi.h"



typedef CHAR(WINAPI* EstablishConnection) (std::string serverIP, int serverPort);

int main()
{
    BOOL freeResult, runTimeLinkSuccess = FALSE;
    //HINSTANCE Arti = NULL;
    EstablishConnection EstablishConnectionptr = NULL;

    // Loading the DLL files using LoadLibrary ---------------------------------------------------------------------------------

    HINSTANCE Arti = LoadLibraryA("C:\\Users\\CCRT\\source\\repos\\Connection\\Connection\\Articares.Core.dll");
    HINSTANCE Log = LoadLibraryA("C:\\Users\\CCRT\\source\\repos\\Connection\\Connection\\NLog.dll");

    // DLL LOAD CHECK ---------------------------------------------------------------------------------------------------------
    if (Arti == NULL) {
        std::cout << "Arti load error\n";
        return 0;
    }
    if (Log == NULL) {
        std::cout << "Log load error\n";
        return 0;
    }
    // Pointers to Functions in DLL ---------------------------------------------------------------------------------------------

    EstablishConnectionptr = (EstablishConnection)GetProcAddress(Arti, "EstablishConnection");

    // Initialise Functions --------------------------------------------------------------------------------------------------  
    if (runTimeLinkSuccess = (NULL != EstablishConnectionptr))
    {

        CHAR retVal = EstablishConnectionptr("192.168.102.1", 3000);
    }

    //Free the DLLs -------------------------------------------------------------------------------------------------------------
    FreeLibrary(Arti);
    FreeLibrary(Log);

    //If unable to call the DLL function, use an alternative. 
    if (!runTimeLinkSuccess)
        printf("Unable to use function so use alternative method\n");

}

这是 DLL 中的EstablishConnection()

public bool EstablishConnection(string serverIP, int serverPort)

您需要创建相同.NET Framework version C++/CLR。

例如

C# DLL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary2
{
    public class Class1
    {

        public void myfunction()
        {
            Console.WriteLine("hello");
        }
    }
}

创建 C++/CLR 控制台应用程序(.NET Framework)

浏览并添加 DLL 参考:

在此处输入图像描述

在此处输入图像描述

C++

#include "pch.h"

using namespace System;
using namespace ClassLibrary2;
int main(array<System::String ^> ^args)
{
    Class1 c1;
    c1.myfunction();

    return 0;
}

输出:你好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM