21xrx.com
2024-12-27 21:25:47 Friday
登录
文章检索 我的文章 写文章
C++ 如何载入资源中的 DLL
2023-07-06 18:41:46 深夜i     --     --
C++ 载入资源 DLL

C++是一种功能强大的编程语言,它允许开发人员创建高效、可靠和安全的软件。在实际的软件开发过程中,我们经常需要将其他程序或库文件(如DLL)加载到我们的应用程序中。但是,当我们想要从资源中加载DLL时,该如何实现呢?

首先,我们需要在资源中添加DLL文件。在Visual Studio的“解决方案资源管理器”当中,我们可以右键单击想要添加DLL的项目(如Win32项目),选择“添加”→“现有项”→“从文件添加”,然后选择我们要添加到资源中的DLL文件。

然后,我们需要使用LoadLibrary函数在运行时加载DLL文件。然而,由于DLL文件现在是在资源中,我们必须通过先将其提取到临时文件夹来使用这个函数。下面的代码演示了如何做到这一点:


HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_MYDLL), RT_RCDATA); //查找资源

if (hResource)

{

  HGLOBAL hLoadedResource = LoadResource(NULL, hResource); //加载资源

  if (hLoadedResource)

  {

    DWORD dwResourceSize = SizeofResource(NULL, hResource); //获取资源大小

    void* pResourceData = LockResource(hLoadedResource); //锁定资源

    WCHAR wszDllPath[MAX_PATH];

    GetTempPath(MAX_PATH, wszDllPath); //获取临时文件夹路径

    wcscat_s(wszDllPath, L"mydll.dll"); //创建临时文件路径

    HANDLE hDllFile = CreateFile(wszDllPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); //创建临时文件

    if (hDllFile != INVALID_HANDLE_VALUE)

    {

      DWORD dwBytesWritten;

      WriteFile(hDllFile, pResourceData, dwResourceSize, &dwBytesWritten, NULL); //将资源写入临时文件

      CloseHandle(hDllFile);

      HMODULE hDllModule = LoadLibrary(wszDllPath); //加载临时文件

      if (hDllModule)

      可以使用GetProcAddress函数获取DLL中的函数指针

      

    }

  }

}

以上代码首先使用FindResource函数在资源中查找我们添加的DLL文件,然后使用LoadResource函数将其加载到内存中。接着,我们通过SizeofResource函数获取DLL文件的大小,然后使用LockResource函数锁定DLL数据。为了将DLL文件保存到临时文件夹中,我们使用CreateFile函数创建一个临时文件,并通过WriteFile函数将数据写入该文件中。最后,通过LoadLibrary函数加载该临时文件,并使用GetProcAddress函数获取DLL文件中的函数指针。

总的来说,在C++中从资源中加载DLL文件并不是一项非常困难的任务。通过使用FindResource、LoadResource、SizeofResource和LockResource函数,我们可以将DLL文件从资源中加载到内存中,然后再通过CreateFile、WriteFile和LoadLibrary函数将其保存到临时文件夹中并加载到我们的应用程序中。这样就可以轻松实现从资源中加载DLL文件的需求。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复