S13161 2022-01-20 08:27 采纳率: 66.7%
浏览 45
已结题

DLL文件加载显示找不到指定的程序

使用DLL文件加载函数时,函数报错说找不到指定的程序:

#include <iostream>
#include <Windows.h>
#include <string>
#include <comdef.h>
using namespace std;
int main()
{
    try {
        static HMODULE hmGHSL = LoadLibrary(L"GSHL.dll");
        if (hmGHSL == nullptr) {
            throw GetLastError();
        }
        static std::string(*fLoadFileFunction)(std::string) =
            reinterpret_cast<std::string(*)(std::string)>(GetProcAddress(hmGHSL, "GetFile"));
        if (fLoadFileFunction == nullptr) {
            throw GetLastError();
        }
        fLoadFileFunction("Null");
    }
    catch (DWORD& hr) {
        //获取错误信息并输出
        _com_error err(hr);
        std::wstring desc = err.ErrorMessage();
        MessageBox(GetConsoleWindow(), desc.c_str(), L"", MB_OK);
    }
    catch (const char* c) {
        MessageBoxA(GetConsoleWindow(), c, "", MB_OK);
    }
}

程序的结果为:

img

GSHL.dll:
function.cpp:

#include "pch.h"
#include <iostream>
#include <vector>
#include <map>
/*作用:获得编译入DLL文件GSHL.dll的文件的字符串形式
* 参数:
*    1.文件的名称
*/
std::string __declspec(dllexport) GetFile(std::string filename) {
    //以下是声明
    static std::map<std::string, std::vector<int>> filemap = {
        {"Null",{0}}
    };


    //函数返回
    std::vector<int> a = filemap[filename];
    if (a.size() == 0) throw "File not found.";
    std::string res;
    for (int c : a) {
        res += (char)c;
    }
    return res;
}

pch.h

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H

pch.cpp

// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。

dllmain.cpp:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

framework.h:

#pragma once

#define WIN32_LEAN_AND_MEAN             // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
  • 写回答

2条回答 默认 最新

  • S13161 2022-02-05 00:13
    关注

    原因是因为C++编译时会修改函数的名称,所以要用C的编译方式,函数定义的前面应该是_declspec(dllexport) extern "C"

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 创建了问题 1月20日

悬赏问题

  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。
  • ¥15 SQL Server analysis services 服务安装失败
  • ¥15 基于面向对象的图书馆借阅管理系统