延迟加载DLL

2023-12-19

为简单起见,我将 DLL_TUTORIAL.dll 和头文件 MathFuncsDll.h 放在根文件夹 C:\ 中。

然后,创建空项目,设置

配置属性->链接器->输入->延迟加载Dll's

to

C:\DLL_TUTORIAL.dll;%(DelayLoadDLLs)

and

配置属性->VC++目录->包含目录

to

C:\;$(包含路径)

编译器命令:

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "_MBCS" /Gm- /EHsc /MT /GS /Gy /fp:精确 /Zc:wchar_t /Zc:forScope /Fp"Release\clean_rough_draft.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:队列

该项目仅包含 main.c 文件。

main.cpp

#include <Windows.h>
#include <iostream>
#include "MathFuncsDll.h"

using namespace MathFuncs;
using namespace std;

int main()
{
    std::cout<< MyMathFuncs<int>::Add(5,10)<<endl;

    system("Pause");
    return 0;
}

Dll已在不同的解决方案中成功编译。

MathFuncsDLL.h

namespace MathFuncs
{
    template <typename Type>  
    class MyMathFuncs   
    {
    public:
        static __declspec(dllexport) Type Add(Type a, Type b);

        static __declspec(dllexport) Type Subtract(Type a, Type b);

        static __declspec(dllexport) Type Multiply(Type a, Type b);

        static __declspec(dllexport) Type Divide(Type a, Type b);

    };


}

这些函数的定义:

#include "MathFuncsDll.h"

#include <stdexcept>

using namespace std;

namespace MathFuncs
{
    template <typename Type>
    Type MyMathFuncs<Type>::Add(Type a,Type b)
    { return a+b; }

    template <typename Type>
    Type MyMathFuncs<Type>::Subtract(Type a,Type b)
    { return a-b; }

    template <typename Type>
    Type MyMathFuncs<Type>::Multiply(Type a,Type b)
    { return a*b; }

    template <typename Type>
    Type MyMathFuncs<Type>::Divide(Type a,Type b)
    { 
        if(b == 0) throw new invalid_argument("Denominator cannot be zero!");
        return a/b; 
    }
}

运行该程序失败:

1>main.obj : 错误 LNK2001: 无法解析的外部符号“public: static int __cdecl MathFuncs::MyMathFuncs::Add(int,int)” (?Add@?$MyMathFuncs@H@MathFuncs@@SAHHH@Z) 1>C:\Users\Tomek\Documents\Visual Studio 2010\Projects\clean_rough_draft\Release\clean_rough_draft.exe:致命错误 LNK1120:1 个未解析的外部

你能指出我的错误吗?


该问题与 DLL 的延迟加载与否无关。我在这里看到两个问题:

  1. 您正在导出模板化函数。这种方式行不通,因为 Visual C++ 编译器不支持模板导出,但该导出已从标准中删除。为此,您有两种可能的解决方案:

    • 将方法的实现移至 .h 文件中,因此不再需要 DLL,因为所有代码都在头文件中;
    • 使用您将在客户端应用程序中使用的类型实例化模板。这是通过将具有确切类型的实例化代码放入您的 cpp 文件中来完成的,执行一些操作extern template标头中的声明等。您可以在 Google 中查找更多信息,只需搜索“extern template DLL”或类似的内容即可。
  2. 您只在创建 DLL 时导出方法,但从不导入它们(或者至少我从代码中看到的是这样)。你用__declspec(dllexport)在每个方法前面,它告诉编译器将该方法放入 DLL 中。当您想要从客户端应用程序使用这些方法时,您必须从 DLL 导入它们。这是通过放置来完成的__declspec(dllimport)在每个方法前面。由于您不能在方法上放置两个前缀,因此您必须创建两个几乎相同的头文件,只是方法前缀不同,或者根据这是 DLL 构建代码还是客户端应用程序使用一些宏替换。再次,你可以在谷歌中查找它,看看它是如何完成的。

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

延迟加载DLL 的相关文章

随机推荐

  • 在 Windows 中查看共享内存的程序?

    我正在寻找一个程序来查看和浏览 Windows x32 x64 中的 本地 共享内存 我知道它的存在 因为我以前见过它的实际情况 由于某种原因 Google 和 MSDN 在这方面让我失望了 I think 访问检查 http techne
  • 如何从不存在的(自动生成的唯一 ID)电子邮件发送电子邮件?

    我是某个域的所有者 目前正在 Google Apps for Business 中托管该域的邮件 MX 我有一个包罗万象的帐户 因此如果有人回复电子邮件 电子邮件受保护 cdn cgi l email protection 我有一个机器人可
  • 多线程 Nashorn:o.constructor === o.constructor 给出 false

    我正在 Nashorn 中尝试多线程脚本加载和评估 并得到了令人震惊的行为 having some object o loaded in another thread print o constructor o constructor fa
  • iOS SDK中使用FourSquare API查找附近地点

    如何使用 Foursquare API 在 iOS 应用程序中查找附近的地点 由于我是这个环境的新手 所以请帮助我找到 API 上可用的任何示例教程 我曾经经历过这个链接 https github com anka bw examples
  • jboss 7.1.1 中两个 Web 应用程序的两个 DNS 名称

    我有个问题 我有两个网络应用程序部署为战争 我们将它们称为 app1 war 和 app2 war 我希望通过 URL www website com 访问 app1 war 并且希望通过 www anotherweb com 访问 app
  • 中心页脚固定在 IE 底部

    我正在为一个大学项目编写一个网络界面 我一直在处理这个问题 我希望我的页脚固定在底部 这样无论我使用哪个屏幕或切换全屏模式 它都会就位 它适用于除 IE7 之外的所有其他浏览器 我不必支持以前的版本 超文本标记语言 div a href i
  • OOAD设计问题

    我有两张桌子 tblCustomer tblProduct tblCustomer Id Integer auto increament Name Varchar 30 tblProduct Id Integer auto increame
  • 这个可变参数模板代码有什么作用?

    template
  • 如何在 JFreeChart 散点图中创建空心形状

    使用的 JFreeChart 版本 1 5 0 我尝试了以下方法来获得散点图中的空心形状 PlotFrame java文件内容 package javaapplication1 import javax swing JFrame impor
  • 停止CSS3动画跳跃

    我有跟随小提琴 http jsfiddle net mauricederegt rtS5U 4 仅限 Webkit Chrome 只要观看动画一段时间 您就会看到它 停止 一毫秒 然后又继续 难道是svg文件本身 如果是这种情况 我该如何修
  • 如何在 shell 脚本中运行“cd”并在脚本完成后保留在那里?

    我在 shell 脚本 bash 中使用了 更改目录 bin bash alias mycd cd some place mycd pwd pwd prints some place正确 但脚本完成后我当前的工作目录不会改变 是否可以通过脚
  • IIS7 + PHP + HTTP POST = 挂起?

    我通过 Windows Web App Gallery 在带有 IIS7 的 Windows 7 x64 计算机上安装了 PHP 一切似乎都很顺利 一个简单的 phpinfo 页面就像您想象的那样工作 但是 每当我向 PHP 页面发出 PO
  • 如何正确并行化嵌套 for 循环

    我正在使用 OpenMP 并行化标量嵌套 for 循环 double P N N double x 0 0 y 0 0 for int i 0 i
  • 检索手机号码和IMEI

    我想找回自己的手机号码和IMEI 如何从 Android 手机获取此信息 use TelephonyManager tm TelephonyManager getSystemService Context TELEPHONY SERVICE
  • Spring MVC 中的模拟服务

    我在 Spring MVC 中模拟服务时遇到问题 Controller public class CompanyController Autowired private CompanyService companyService Autow
  • 如何禁用 Opera 中的登录/密码突出显示?

    当用户确认 保存密码 提示时 Opera 始终以橙色突出显示登录 密码输入 它不适合我的设计 有什么 CSS 方法可以改变 禁用它吗 Edit如果不通过CSS 还有其他解决方案吗 无法使用 CSS 禁用此功能 这是浏览器功能 尝试不同的边框
  • Google 云平台 - 计算引擎/App 引擎 - SSL/HTTPS

    目标 使我的谷歌云应用程序 SSL 使用预构建的解决方案在谷歌的计算引擎上启动一个实例 我需要上传 ssl 证书才能接受信用卡 并且或多或少可以做任何事情 我找不到用户界面或任何使用计算引擎对我的应用程序 域进行 ssl 的方法 谷歌的应用
  • Eclipse 使用 EGit,很难看到 git-blame 信息

    使用 Eclipse Indigo Service Release 2 EGit 插件和 JDK 1 7 我已经看到它应该支持责备注释 但我无法让它像我看到的那样显示在 Eclipse Wiki 上 http wiki eclipse or
  • 在 ngFor Angular 2 中设置输入类型复选框的选中状态

    我有一个 Angular 2 应用程序 我使用 ngFor 来处理一堆复选框 当我初始化这个组件时 我需要根据天气设置复选框的状态 id 存在于数组中 div class col md 12 div class col lg 12 opti
  • 延迟加载DLL

    为简单起见 我将 DLL TUTORIAL dll 和头文件 MathFuncsDll h 放在根文件夹 C 中 然后 创建空项目 设置 配置属性 gt 链接器 gt 输入 gt 延迟加载Dll s to C DLL TUTORIAL dl