文档章节

stdcall与DLL

我爱睡觉
 我爱睡觉
发布于 2017/06/24 17:35
字数 353
阅读 1
收藏 0

  如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将 函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与 __cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname @number ;而 __cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
  Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h):

#define CALLBACK __stdcall //这就是传说中的回调函数
#define WINAPI __stdcall //这就是传说中的WINAPI
#define WINAPIV __cdecl
#define APIENTRY WINAPI //DllMain的入口就在这里
#define APIPRIVATE __stdcall
#define PASCAL __stdcall

  在lib.h中,应这样声明add函数:

int __stdcall add(int x, int y);

  在应用工程中函数指针类型应定义为:

typedef int(__stdcall *lpAddFun)(int, int);

  若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用),弹出如图7所示的对话框。

 

图7 调用约定不匹配时的运行错误

本文转载自:http://blog.csdn.net/zhangmiaoping23/article/details/3955208

我爱睡觉
粉丝 3
博文 2120
码字总数 0
作品 0
南昌
私信 提问
关于windows dll的生成

关于windows dll的生成 今天上午看到VC板上有人提到dll调用约定的问题,发现自己一直以来只是网上说的文章去做的,具体的实验还真的没有做过。中午闲来无聊,写了几个小例子,测试一下windo...

KavenSu
2014/01/16
159
0
BCB 编写 DLL 终极手册

一. 编写 DLL File/New/Dll 生成 Dll 的向导,然后可以添加导出函数和导出类 导出函数:extern "C" declspec(dllexport) ExportType FunctionName(Parameter) 导出类:class declspec(dllexp......

狂斩一条龙
2011/07/31
0
0
dll的def文件与__declspec(dllexport)导出函数方式比较

dll的def文件与declspec(dllexport)导出函数方式比较 【declspec(dllexport) 方式】 首先对C和C++编译(extern "C")与调用约定(cdecl、stdcall、fastcall)进行组合测试: 【C++编译】 declsp...

simpower
03/06
16
0
如何用 C++ 为 Python 写 dll

如何用 C++ 为 Python 写 dll 来自: http://zhongwei-leg.iteye.com/blog/693519 博客分类: C++ CC#C++PythonOS 1. 先新建一个名为 hello.cpp 的 C++ 源文件: #include <stdio.h> #define......

FreeBlues
2012/07/17
252
0
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是cdecl方式,而windows API则是std...

AlphaJay
2010/08/20
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.6K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部