VC中隐式链接无.LIB动态链接库的方法

Meta DINOv3实战指南:如何用7B参数ViT模型提升你的视觉任务性能(附Hugging Face部署教程) 本文提供了Meta DINOv3 7B参数ViT模型的实战部署指南。文章详细解析了该自监督视觉模型的优势,并重点演示了如何在Hugging Face平台上高效加载这一大规模模型,同时给出了图像分类、语义分割等下游任务的性能提升技巧与代码示例,帮助开发者在实际视觉任务中应用这一前沿技术。 阅读详情
 摘要:     本文提出在不具备动态链接库的源文件或.   Lib输入库文件或欲调用Windows未公开函数的情况下重建.Lib文件的方法,并给出相应的例子。  
   
  关键词:未公开函数   VC   DLL   无源文件   .Lib文件   隐式链接  
  undocumented   function,no   source   ,implicitly   link  
   
          由于我们经常要调用一些第三方厂商或其他编译器编写的动态链接库,但是一般都不提供源文件或.lib文件,而作为VC隐式链接到DLL(implicitly   link   to   the   DLL)调用,这些却是必需的。本文将主要讨论在没有源文件及.lib输入库文件或欲调用Windows未公开函数的情况下重建.Lib文件的方法。在建立之前,我们首先要了解一下DLL输出函数的几种方式。  
   
  一、从DLL中输出函数的方式(calling   conventions   )  
  _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。  
  _stdcall是Pascal程序的缺省调用方式,通常用于Win32   Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。  
  _fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。  
   
  用VC建立一个空的动态链接库,并加入以下三个文件:  
  //noname.h     动态链接库头文件  
  extern   "C"   void   _stdcall     stdcallproc(void);  
  extern   "C"   void     _cdecl   cdeclproc(void);  
  extern   "C"   void     _fastcall   fastcallproc(void);  
   
  //noname.cpp       动态链接库实现文件  
  #include   <windows.h>  
  extern   "C"   void   _stdcall     stdcallproc(void)  
  { MessageBox(0,"stdcall   function",”dll   call",0);  
  }  
  extern   "C"   void     _cdecl   cdeclproc(void)  
  { MessageBox(0,"cdecl   function   ",”dll   call",0);  
  }  
  extern   "C"   void     _fastcall   fastcallproc(void)  
  { MessageBox(0,"fastcall   function   ",”dll   call",0);  
  }  
   
  //noname.def     动态链接库输出函数定义  
  LIBRARY             "noname"  
  EXPORTS  
  stdcallproc   @1   noname    
  cdeclproc     @2  
  fastcallproc   @3  
   
  编译后生成noname.lib,输出函数_cdeclproc,_stdcallproc@0,  
  @fastcallproc@0;生成的noname.dll在Exescope等PE格式的工具中只能看到cdeclproc和fastcallproc函数,因为stdcallproc被指定noname属性,没有名字输出,类似于Windows未公开函数。  
   
  二、可执行程序调用DLL的方式  
          可执行程序可以采用隐式链接(implicit   linking)或显式链接(explicit   linking)两种方式调用一个DLL。  
  使用显式链接时,使用DLL的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用GetProcAddress函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary),因为不是本文重点,具体例程请参考有关文档。显然,在调用大量的函数时这种方法会很不方便。  
  使用隐式链接时,可执行程序链接到一个包含DLL输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL的输出函数,调用方法和程序内部其他的函数是一样的。  
   
  三、重建.Lib输入库文件  
  根据微软的建议,要想隐式地链接到一个DLL,可执行程序必须从DLL的提供者那儿得到一个包含输出函数的头文件(.h文件)、一个用于链接的输入库(.lib文件)。愿望是很好的,但是一般情况下,我们都无法得到第三方动态链接库的输入库文件,或者我们需要调用Windows未公开函数。如果你是使用Delphi或Visual   Basic开发程序,那么,你只要简单的申明一下函数和输出库就可以了。但是,使用VC的朋友们只好重建.Lib文件了。  
  1.删掉第一步中生成的noname.lib(假设我们没有这个文件)。  
  2.用微软的DumpBin.exe:dumpbin   /exports   noname.dll>noname.def,留下noname.def文件的输出段:  
          ordinal   hint   RVA             name  
                      2         0   00001005   cdeclproc  
                      3         1   0000100F   fastcallproc  
                      1             0000100A   [NONAME]  
  修改为:  
  LIBRARY             "noname"  
  EXPORTS  
  cdeclproc         @2  
  fastcallproc   @3  
  nonameproc       @1   //请注意与第一步中noname.def的区别:nonameproc可以自己指定为任何名字  
  再执行   lib.exe   /def:noname.def即可生成noname.lib文件(但如果这个动态链接库不仅仅包含_cdecl类型函数,那么这个noname.lib还不是最终可用的.lib文件,具体请看下文)。  
   
  3.建立一个名为DllCaller的Win32控制台程序,将刚才生成的noname.dll和noname.lib拷入DllCaller/debug目录。  
   
  //DllCaller.cpp  
  //声明函数原型  
  extern   "C"   void   _stdcall     nonameproc(void);  
  extern   "C"   void     _cdecl   cdeclproc(void);  
  extern   "C"   void     _fastcall   fastcallproc(void);  
  //链接输入库文件  
  #pragma   comment(   lib,   "debug//noname.lib"   )  
   
  int   main(int   argc,   char*   argv[])  
  {  
          nonameproc();  
          cdeclproc();  
          fastcallproc();  
          return   0;  
  }  
  编译器产生如下错误:  
  DllCaller.obj   :   error   LNK2001:   unresolved   external   symbol   @fastcallproc@0  
  DllCaller.obj   :   error   LNK2001:   unresolved   external   symbol   _nonameproc@0  
  根据错误提示信息将noname.def更改如下:  
  @fastcallproc@0   @3  
  nonameproc@0   @1    
  重新生成noname.lib,即可重新编译DllCaller.exe。  
   
  四、调用Windows未公开函数  
  根据以上分析,下面给出一个简单的调用Window98系统Shell32.DLL中序号为60的未公开函数,执行后将出现重新启动的对话框。  
  //shell32.def   ,据此生成Shell32.LIB  
  LIBRARY             "shell32"  
  EXPORTS  
  SHShutDownDialog@4   @60  
   
  //   DllCaller.cpp   :   调用未公开函数的控制台程序  
  //函数声明  
  extern   "C"   long     _stdcall   SHShutDownDialog(long   lShutdown);  
  //链接输入库文件  
  #pragma   comment(   lib,   "debug//shell32.lib"   )  
  int   main(int   argc,   char*   argv[])  
  {  
        SHShutDownDialog(0);  
  return   0;  
  } Top
SAP RAP 校验全流程:从 EML 读取到消息上屏与阻止落库 本文系统梳理了 SAP ABAP RAP 中的校验流程(The Validation Process),结合 Airline/Connection 案例,详细讲解了三类核心校验:语义键唯一性、外键有效性和字段间一致性。文章覆盖了 EML 的 READ ENTITIES 操作、reported-* 与 failed-* 结构的使用方法、消息创建与字段绑定技巧,以及处理草稿数据时的 UNION 查询策略。通过代码示例演示了如何实现校验逻辑、生成错误消息并阻止无效数据持久化,同时提供了常见问题的排查建议。全文注重 阅读详情

相关推荐

瑞芯微RK3506开发板DSM音频开发避坑指南:从硬件改接到内核配置全流程

本文详细解析了在瑞芯微RK3506开发板上进行DSM音频开发的完整流程与关键避坑点。内容涵盖从硬件改造(如电阻焊接)、内核驱动配置(DTS参数、补丁应用)到系统调试与波形分析的全过程,旨在帮助嵌入式开发者高效实现高信噪比、低成本的音频方案,避免常见错误。

weixin_29164091的博客 408

VC 链接没有 lib 文件的 dll

在使用 VC 链接 dll 时,通常需要一个导入库文件(.lib),但有时我们只有一个 dll 文件,怎么办呢? 通常,在链接库文件时,需要一个 (.lib)文件,lib 文件分为两种:一种为静态链接库(StaticLibary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(ImportLibary,以下简称“导入库”)。VC 在链接 dll 时,...

weixin_30764883的博客 308

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

《C++避坑神器·十五》动态库只有dll文件,没有.lib文件时动态调用dll的中类和成员函数

换句话说,如果应用程序决定要调用 DLL 中的函数,则可以将 DLL 显式加载到进程的地址空间中,获取 DLL 中包含的函数的虚拟内存地址,然后使用此内存地址调用函数。该列表包含成员函数Add、Sub和构造函数calculate的虚拟内存地址,1,3,5后面一串乱码实际是构造函数,Add,Sub对应的函数名称,现在我们要用def文件来修正它。我们在自己的项目中新建一个“calculate.def”文件,并在“工程->设置->Link”中添加参数(/def:“.\calculate.def”),并编。

cs1395293598的博客 4040

别再到处找模板了!手把手教你用Vue3+Element Plus搭建一个‘能跑起来’的管理后台原型

本文详细介绍了如何利用Vue3和Element Plus在72小时内快速搭建一个功能完整的管理后台原型。从环境准备到项目获取、依赖安装、原型定制、数据模拟以及构建优化,手把手教你打造一个可直接演示的后台系统,特别适合创业者快速验证产品逻辑。

weixin_26854555的博客 182

硬件工程师八大细分岗位详解:从芯片到整机的技术分工与职业选择

硬件工程作为电子系统设计的核心领域,涉及从芯片级到整机级的完整技术链条。其基本原理是通过电路设计、信号处理和功率管理等技术,将电子元件集成为功能完备的硬件系统。随着产品复杂度提升,硬件工程师岗位出现高度专业化分工,这种细分不仅提升了技术深度,更优化了团队协作效率。在工程实践中,信号完整性和电源完整性成为高速数字设计的两个关键技术挑战,直接影响系统稳定性。本文基于行业热词"硬件工程师"和"信号完整性",深入解析八大细分岗位的技术差异,帮助从业者明确职业发展方向,构建系统化的硬件设计思维。

weixin_33811539的博客 450

没有lib文件的情况下,怎么隐式调用dll

有时候,总会遇到只有一个dll没有头文件,也没有lib文件的情况下,怎么隐式调用呢? 1.首先要生成lib文件,方法如下: Visual C++ 开发工具提供了两个命令行工具,一个是dumpbin.exe,另一个是lib.exe。利用这两个工具即可从dll导出其对应的lib。 1)在命令行执行: dumpbin /exports yourdll.dll > yourdll.def ...

4813

Ambari 安装部署教程(手把手教学)【超级详细】

本文为读者提供了一套超详细的 Apache Ambari 安装部署教程,采用手把手教学方式,适合初学者及大数据运维人员。内容涵盖前期准备、环境配置、Ambari Server 与 Agent 安装、集群初始化配置、常见问题排查等全流程操作,确保用户能够顺利搭建稳定的 Hadoop 大数据平台管理系统。

Five的博客 1万+

VC++调用DLL

调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载时链接 这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像

shiwaxinbin的专栏 1万+

RK3588平台开发系列讲解(以太网篇)MDIO底层驱动

沉淀、分享、成长,让自己和他人都能有所收获!😄。

内核笔记 6885

Flatten 层的深度理解与运用

Flatten 层的深度理解与运用

你要拥有一个你喜欢并且热爱的人生 7032

2020.3.20C++学习笔记——无lib文件链接动态库

C++学习笔记——无lib文件链接动态库 之前工作中使用动态库时用的都是自己或公司的库,基本上原始工程文件都有,所以一直用的是VS的依赖库链接方式。但是最近工作中需要使用外部的动态库文件接口,动态库只有Release版本,没有lib文件,所以需要学习怎么在无lib文件情况下链接DLL。 ...

CQ的学习笔记 1374

UG NX二次开发(C++)-库缺少需要的入口点的原因与解决方案

在UG NX二次开发过程中,有时会遇到形形色色的bug,比如有个读者其采用UG NX二次开发(C++)时,遇到“库缺少需要的入口点”这个问题,看了一下他发给我的源代码,感觉有必要讲一下UG NX二次开发(C++)遇到此类问题的可能情况与解决方法。自然,这是博主的经验之谈,有不足之处还请在评论区讨论。

GimiGimmy 2201

VC中调用动态链接库函数的标准方法

VC中调用动态链接库函数的标准方法,分为两类:隐式调用、显示调用。 第一种方法:隐式调用 隐式调用需要如下文件: (1) DLL 函数声明头文件 MPC.h; (2) 编译连接时用的导入库文件 MPC08.lib (3) 动态链接库文件 MPC08.dll; (4) 设备驱动程序 MPC08.sys; 以上文件中的(1)(2)两项可在 MPC08E 板卡应用程序安装目录“\MPC08 Develo...

weixin_43688754的博客 1786

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WIN_静态库与动态库的加载、VC project参数设置

VC环境下的静态库使用 一.  静态库包括.lib和.h文件,在工程中使用静态库分为3步:  在工程中加入静态库,有三种方法:       **方法一:项目设置中引用.lib,project->   setting->   link->   object/library modules中添加.lib;(可以在这里指定路径,也可以在project>settings>link>input的A

机器视觉之家 4176

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lib库反编译C语言,C语言静态链接库(lib)与动态链接库(dll)

今天看到了之前的笔记,看到之前写的笔记,感觉自己都不认得了~~一、静态链接库(lib)首先创建 “在VC6中创建项目:Win32 Static Library”在项目中创建两个文件:xxx.h 和 xxx.cpp头文件的话就写函数声明,cpp正常来写函数实现即可!例如:[C] 纯文本查看 复制代码x.h代码:int Plus(int x,int y);x.cpp代码 int Plus(in...

weixin_39758712的博客 4988

MFC下DLL/lib的调用

1、简介: dll和.lib都是程序集合,便于代码重用。都是二进制的文件。 .dll也叫动态链接库,与程序链接的方式为运行时链接(run-time linked),为PE(portable executable)格式,也就是程完整的程序。.exe、.dll、.fon、.mod、.drv、.ocx等等都是动态链接库。如.exe为系统调用的函数集合。.dll不存在同名引用,且有导出表,与导

Kelvin_Yan的专栏 1362

创建和调用dll文件简单示例(vc6)

在vc6中,新建一个Win32 Dynamic-Link Library Project.命名为:dllexample。然后看下面的例子。下面是dllexample.cpp://===================================#include "stdafx.h"/* * dll文件的输出函数声明 */extern "C" _declspec(dllexport) float

2558

LIB 和 DLL 区别

共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。 共有两种链接方式: 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅

FrankieWang008的专栏 640

隐式链接无.LIB动态链接库

 由于我们经常要调用一些第三方厂商或其他编译器编写的动态链接库,但是一般都不提供源文件或.lib文件,而作为VC隐式链接到DLL(implicitly link to the DLL)调用,这些却是必需的。本文将主要讨论在没有源文件及.lib输入库文件或欲调用Windows未公开函数的情况下重建.Lib文件的方法。在建立之前,我们首先要了解一下DLL输出函数的几种方式。一、从DLL中输出函数的方式...

weixin_33862993的博客 233

C++调用.lib的方法

C++调用.lib的方法 1. 隐式加载 1. 隐式加载链接,有三种方法: 1. LIB文件直接加入到工程文件列表中。 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件。然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头...

《好好先生》专栏 1万+
上一篇: winpcap一些开发实践
下一篇: 编写有图形界面的 Windows 服务程序
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值