DLL函数重载,以及一些前提知识的整理~

C++Builder多语言支持实战:资源DLL动态切换技术详解 软件国际化与本地化是软件开发中的重要环节,其核心原理在于将用户界面文本、图像等资源与程序逻辑代码分离。通过资源动态加载技术,可以在不重新编译程序的情况下实现多语言支持,这大大提升了软件的可维护性和部署灵活性。在Windows桌面开发中,资源动态链接库(DLL)是实现这一目标的经典方案,它利用操作系统原生资源管理机制,实现运行时语言资源的切换。本文通过一个具体的C++Builder 6项目Demo,深入剖析了如何设计语言管理器(LangManager)、组织多语言资源文件(.rc)、以及实现窗体资源的动态重载 阅读详情

__stdcall, __cdecl, extern "C"等一些知识整理下~网上也有不少前辈的精彩文章整理一下放在最下面~

 

dll会随附生成一个lib,里面存的是函数名什么的,那么可以从他身上下手所以就不必委曲求全的去extern "C"了。也就是用静态调用~本来想用什么宏定义来控制输入输出的~太笨了我~我kao~看别人博客上的转载,如果那样的话,你还只包含一次,那岂不是输出代码就用不了了吗?转不过来弯了~一会试试吧,先把自己的代码弄上来吧,自己备忘~前辈们别笑话~

//dllTest.h

#ifndef LIB_H
#define LIB_H

int __declspec(dllexport)add(int x, int y);
float __declspec(dllexport)add(float x, float y);
#endif

 

//dllTest.cpp

#include "dllTest.h"
int add(int x, int y)
{
 return x + y;
}
float add(float x, float y)
{
 return x + y;
}

 

//main.cpp

#include <stdio.h>
#include <windows.h>
#include <iostream>

 

#pragma comment(lib,"../Debug/dllTest.lib")

 

//其实这边若是用宏定义原来头文件时的两个导出和导入就帅多了~包含都文件就可以了~

//__declspec(dllimport)可不要~除非要用static,也是从网上前辈写的文章里看到的~
int __declspec(dllimport) add(int x,int y);
float __declspec(dllimport) add(float x,float y);

 

int main(int argc, char *argv[])
{
 int result = add(2, 3);
 float resultf = add(1.1f, 1.1f);
 std::cout << result << std::endl;
 std::cout << resultf << std::endl;
 return 0;
}

//没错代码是从天极网讲动态链接库教程里改动过来的~
//////////////////////////////////////////////////////////////////////////

 

 

 

 

//////////////////////////////////////////////////////////////////////////

使用Dependency看DLL的导出函数的名字,会发现有一些有意思的东西,这大多是和编译DLL时候指定DLL导出函数的导出符有关系。

当你使用extern "C"的情况下:  
  __stdcall会使导出函数名字前面加一个下划线,后面加一个@再加上参数的字节数,比如_Fun@4就是4个字节

      __cdecl则是前面仅仅有一个下划线

如果不用extern "C"话则使用C++命名机制,涉及到C++ Name Mangling,比较复杂,编译器之间也不太一样。
另外,__declspec(dllexport)仅会对__cdecl进行处理,去掉前面的下划线(对于一般全局函数来说缺省就是__cdecl),而对于其他两种不会处理。

extern "C"的作用是(防止C++编译器的“名字破坏”特性),使编译器按照C的方式生成函数名,C的方式实际的函数名和你写的一样。如果没有这个,则按照C++的方式生成函数名,这样实际的函数名(LoadLibrary方式GetProcAddress传入的函数名)和你写得函数名不一样,这样你用LoadLibrary、GetProcAddress这种方式调用dll就不成功。  
但是用引入库(*.LIB)的方式调用,则编译器自动转换函数名,所以总是没有问题。 

深入理解extern "C"

要明白为何需要使用extern "C",还得从C++中对函数的重载处理开始说起。作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo( int x, int y );

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了类似的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

 

3.“__stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个"@"符号和其参数的字节数”
和
“该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字”
这两个概念感觉很相似~这两个会不会冲突啊?放进符号表里的是哪个?那另一个是干什么用的?

答:一个是调用约定产生的字符,一个是本身名称进行的修饰
两者合成的名称才是最后的符号名称字符串

//////////////////////////////////////////////////////////////////////////

//天极网的教程真的太牛×了~

  4.7 DLL导出类

  DLL中定义的类可以在应用工程中使用。

  下面的例子里,我们在DLL中定义了point和circle两个类,并在应用工程中引用了它们(单击此处下载本工程)。

//文件名:point.h,point类的声明

#ifndef POINT_H
#define POINT_H
#ifdef DLL_FILE
 class _declspec(dllexport) point //导出类point
#else
 class _declspec(dllimport) point //导入类point
#endif
{
 public:
  float y;
  float x;
  point();
  point(float x_coordinate, float y_coordinate);
};

#endif

//文件名:point.cpp,point类的实现

#ifndef DLL_FILE
 #define DLL_FILE
#endif

#include "point.h"

//类point的缺省构造函数

point::point()
{
 x = 0.0;
 y = 0.0;
}

//类point的构造函数

point::point(float x_coordinate, float y_coordinate)
{
 x = x_coordinate;
 y = y_coordinate;
}

//文件名:circle.h,circle类的声明

#ifndef CIRCLE_H
#define CIRCLE_H
#include "point.h"
#ifdef DLL_FILE
class _declspec(dllexport)circle //导出类circle
#else
class _declspec(dllimport)circle //导入类circle
#endif
{
 public:
  void SetCentre(const point &centrePoint);
  void SetRadius(float r);
  float GetGirth();
  float GetArea();
  circle();
 private:
  float radius;
  point centre;
};

#endif

//文件名:circle.cpp,circle类的实现

#ifndef DLL_FILE
#define DLL_FILE
#endif
#include "circle.h"
#define PI 3.1415926

//circle类的构造函数

circle::circle()
{
 centre = point(0, 0);
 radius = 0;
}

//得到圆的面积

float circle::GetArea()
{
 return PI *radius * radius;
}

//得到圆的周长

float circle::GetGirth()
{
 return 2 *PI * radius;
}

//设置圆心坐标

void circle::SetCentre(const point &centrePoint)
{
 centre = centrePoint;
}

//设置圆的半径

void circle::SetRadius(float r)
{
 radius = r;
}

  类的引用:

#include "../circle.h"  //包含类声明头文件

#pragma comment(lib,"dllTest.lib");

int main(int argc, char *argv[])
{
 circle c;
 point p(2.0, 2.0);
 c.SetCentre(p);
 c.SetRadius(1.0);
 printf("area:%f girth:%f", c.GetArea(), c.GetGirth());
 return 0;
}

  从上述源代码可以看出,由于在DLL的类实现代码中定义了宏DLL_FILE,故在DLL的实现中所包含的类声明实际上为:

class _declspec(dllexport) point //导出类point
{
 …
}

  和

class _declspec(dllexport) circle //导出类circle
{
 …
}

  而在应用工程中没有定义DLL_FILE,故其包含point.h和circle.h后引入的类声明为:

class _declspec(dllimport) point //导入类point
{
 …
}

  和

class _declspec(dllimport) circle //导入类circle
{
 …
}

  不错,正是通过DLL中的

class _declspec(dllexport) class_name //导出类circle 
{
 …
}

  与应用程序中的

class _declspec(dllimport) class_name //导入类
{
 …
}

  匹对来完成类的导出和导入的!

  我们往往通过在类的声明头文件中用一个宏来决定使其编译为class _declspec(dllexport) class_name还是class _declspec(dllimport) class_name版本,这样就不再需要两个头文件。本程序中使用的是:

#ifdef DLL_FILE
 class _declspec(dllexport) class_name //导出类
#else
 class _declspec(dllimport) class_name //导入类
#endif

  实际上,在MFC DLL的讲解中,您将看到比这更简便的方法,而此处仅仅是为了说明_declspec(dllexport)与_declspec(dllimport)匹对的问题。
//

 

 

 

 

 

 

Unity热重载技术深度解析:原理、实践与疑难解决方案 热重载是一种在程序运行时动态更新代码的技术,其核心原理是通过动态修补或快速重启应用域来实现代码的即时替换。这项技术的价值在于它能极大提升开发迭代效率,实现“修改-保存-验证”的即时反馈循环,尤其适用于游戏逻辑调试、UI调整和原型验证等需要频繁修改代码的场景。在Unity开发中,热重载技术通过字节码注入或域重载优化等机制,让开发者无需停止游戏即可看到代码修改效果,从而将开发效率提升一个数量级。本文聚焦UnityScriptHotReload这一具体实现,深入探讨其在实际项目中的应用与问题解决,涵盖了状态管理、 阅读详情

相关推荐

C++ 之 DLL中调用约定和名称修饰

C++ 之 DLL中调用约定和名称修饰

yohnyang的博客 696

DLL函数介绍

关于DLL的函数: 动态链接库中定义有两种函数:导出函数(export function)和内部函数(internal function)。 导出函数可以被其它模块调用,内部函数在定义它们的DLL程序内部使用。 输出函数的方法有以下几种: 1、传统的方法 在模块定义...

ciddk2085的博客 2961

深入Android构建系统:一次修改ro.vendor.build.fingerprint失败的排查与解决记录

本文深入探讨了Android构建系统中修改ro.vendor.build.fingerprint的完整解决方案。通过分析vendor分区的特殊地位和构建指纹的生成路径,提供了三种实战修改方法,并揭示了指纹修改可能遇到的陷阱与对策,帮助开发者彻底解决这一常见问题。

weixin_30621711的博客 141

重载动态库 dll

动态库 dll 也可以重载,如下示例:// dll.cpp#include "dll.h"extern "C++" int max(int a,int b){    return a>b?a:b;}extern "C++" float max(float a,float b){    return a>b?a:b;}int min(int a,int b){    return a>b?b:a;}

~ 飞 扬 的 天 空 ~ 1418

【UE5+Quest3】手部模型替换---3-0

这次手部模型替换遇到了一些小问题,不过好在是bug一个个都处理掉了,我会分开几个章节去整理。详细的视频教程可以参考油管大佬的视频手部素材放到文章末尾,自行下载使用。(仅用作学习研究,不可用于商用)

qbbmnnnnnn的博客 944

MaPLe: Multi-modal Prompt Learning

具体而言,我们在语言分支中附加可学习的上下文标记,并通过耦合函数显式地将视觉 Prompt 置于语言 Prompt 上,以建立它们之间的交互。使用 Prompt 来适应CLIP (语言或视觉) 的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。由此,提出了一种分支感知的多模态 Prompt,通过在两种模态之间共享提示来协调 CLIP 的视觉和语言分支。在 Prompt Tuning 中,必须采取多模态方法获得同时适应 CLIP 的视觉和语言分支,以实现上下文优化的完整性。

weixin_48907099的博客 1051

【概念理解】DLL

【概念理解】DLL 掌握理解dll文件的相关概念,对比其与exe文件的区别,分析使用dll的好处 什么是DLL  一句话总结:   DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,   是软件文件类型。  具体描述:   1、是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式,    " .dll "就是这些库函数的扩展名   2、dll文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要    先载入dll,然后取得

Eniac0的博客 1639

保姆级教程:用Ansys Workbench找出BGA焊点最容易坏的位置(附热循环+振动分析)

本文提供了一份详细的Ansys Workbench教程,指导如何通过热循环和振动分析找出BGA焊点最容易失效的位置。从模型搭建、材料定义到网格划分和载荷设置,全面解析了BGA焊点可靠性分析的全流程,帮助工程师提前预防焊点开裂问题,提升电子封装设计的可靠性。

weixin_30983965的博客 418

C\C++ DLL调用(dll函数重载未解决)

1、首先,建立一个项目,注意要勾选 动态链接库(DLL)。 fun.h, 定义需要给外部调用的函数 #pragma once #include<string> #include<iostream> #define FUN_API _declspec(dllexport) EXTERN_C FUN_API int fun1(int a, int &b, ...

joel的博客 1699

A100 NVLink集群极致优化指南

《A100 NVLink集群通信优化指南》摘要:针对A100 80G SXM机型NVLink 3.0集群,提供硬件配置检查方法(nvidia-smi topo -m)和强制启用指令。重点介绍NCCL参数调优(算法选择、低延迟协议配置)、GPUDirect RDMA启用步骤,以及单机/多机场景下的通信模式选择。包含PyTorch all_reduce基准测试方法,并给出带宽异常排查方案(dmesg检查、NCCL缓存重置)。通过CUDA Graph通信重叠和混合精度优化,可实现90%+带宽利用率。附猿界算力监控

2401_89353317的博客 583

innovus:ccopt_design分段长tree操作

这步don't touch保证后面完整cts尽量不会动到已经长过的tree。需要给sub tree手写一个spec,参考create_ccopt_clock_tree_spec -file的写法,只写create_ccopt_clock_tree和skew group部分就行。

m0_61544122的博客 1676

C++基础知识整理(一)

基础知识搜集整理下,以后查看复习什么的方便一点。  extern "C"使用         主要用于混合语言编程。比如说C语言调用C++开发的DLL,由于C++语言编译后的 函数符号表是带参数类型的,而C语言编译后函数符号表是不带参数类型的。所以要想在C语言中调用C++的DLL,DLL中导出的函数必须加上extern "C".         例:void foo(int,

像梦一样自由 733

SAP Fiori Launchpad 概述

SAP Fiori launchpad 是托管 SAP Fiori 应用程序的 shell,并为应用程序提供导航、个性化、嵌入式支持和应用程序配置等服务。SAP Fiori Launchpad 是移动和桌面设备上 SAP Fiori 应用程序的入口点。启动板显示带有图块的主页,其中可以显示实时状态指示器,例如打开的任务数量。每个图块代表用户可以启动的业务应用程序。这包括 SAP Business Suite 事务应用程序和 SAP Smart Business 分析应用程序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 931

静态.共享的规则MFC DLL/MFC扩展DLL详解

引言:在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种:(1)使用共享MFC DLL的规则DLL(2)带静态链接MFC的规则DLL(3)MFC扩展DLL下面重点解释一下这些DLL的含义区别:一,规则DL...

weixin_34125592的博客 208

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

静态/共享的规则MFC DLL/MFC扩展DLL详解

在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种: (1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点解释一下这些DLL的含义区别: 一,规则...

迪迦 • 奥特曼 922

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

dll函数导出(环境vc6.0+xp)

总觉得自己写过的程序没有做下记录和分析是件很可惜的事情,也许在别人看来是很简单的事情,但是如果没有自己深入研究和思考,并且分析整理的话,那编过的程序也仅仅是个程序,并没有太大的价值,所以想开始对自己写的程序开始记录,分析,这就作为自己编程的一个新的开始。         这次的程序是关于DLL的,其实一直想要掌握DLL的相关知识,但是无奈工作中没有涉及到这方面的程序编写。这次也是自己找个相关的程

yaomin666666的专栏 832

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

静态,共享的规则MFC DLL详解

引言:在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种: (1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点解释一下这些DLL的含义区别:

ouyang503的专栏 727

MFC DLL

在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种: (1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点解释一下这些DLL的含义区别:

nsaygl的专栏 521

mfc dll

 引言:在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种: (1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点解释一下这些DLL

ynt的专栏 632

MFC DLL的基础学习

在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种: (1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点解释一下这些DLL的含义区别:

不系之舟的专栏-QQ讨论群331590339 1067

Delphi笔记(整理)-DLL和BPL

动态调入库(dynamically loadable library)在Windows 下是一个动态链接库(dynamic-link library,DLL), 在Linux 下是一个共享目标库(shared object library) 导入过程或函数最简单的方法是用external 指示字声明它们,比如, 在Windows 下: procedure DoSomething; externa...

goingchan的专栏 698

动态链接库dll简介

前言最近发现,自己在电脑之中做了好多技术笔记,但这些关于自己的总结仅限于在自己电脑中,没有与其他人分享交流(虽然也上传到百度文库中),这其实对于做IT的很不好,应该多于别人交流分享,不仅有助于发现自己对某些知识理解上的一些不足和缺陷,还有助于提高沟通交流能力,而且有时你会发现会有意外收获的哦! 其实很早就开通了博客,之前也写过一些博客,但好久没有...

weixin_33728268的博客 158

转载 doubleli 静态.共享的规则MFC DLL/MFC扩展DLL详解

引言:在编写MFC程序的时候,通常需要编写dll库以供其他程序调用。关于MFC dll的相关知识很多很杂,这里特酷吧结合自己学习中遇到的问题专门整理了一些MFC dll的基础知识。本部分共上下两篇文章,本文为上篇,MFC DLL应用程序类型分为以下三种: (1)使用共享MFC DLL的规则DLL (2)带静态链接MFC的规则DLL (3)MFC扩展DLL 下面重点解释一下这些DLL的含义区

CPUGeometry的博客 644
下一篇: 转msdn上的Data Type Ranges
wang37921
博客等级 码龄18年 14粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值