dll文件

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

▼魔方 西西 提交于 2019-12-12 13:47:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall ,如果用vc开发 dll给其他语言用,则应该指定__stdcall方式 。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作, 如果是__cdecl方式的函数,则 函数本身 (如果不用汇编写)则 不需要关心 保存参数的 堆栈 的清除 ,但是如果是 __stdcall的规则,一定要在 函数 退出(ret)前恢复堆栈 。 1.__cdecl 所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是 由调用者 来维护的。 返回值在EAX中 因此,对于象printf这样变参数的函数必须用这种规则。编译器在编译的时候对这种调用规则的函数生成修饰名的饿时候,仅在输出函数名前加上一个下划线前缀,格式为 _ functionname。 2.__stdcall 按从 右至左的顺序压参数入栈,由被调用者把参数弹出栈 。_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,切记: 函数 自己在退出时清空堆栈

C++动态库dll生成及调用总结

◇◆丶佛笑我妖孽 提交于 2019-12-11 19:53:58
本文主要总结将类生成dll并且调用中遇到的坑和操作。平时打包成一个类的好处在于内部可以有多个成员函数供以调用,且成员变量也可以共用。如果平时想用到多个函数打包成的dll,那一个个封装会很繁琐,且多个函数间可能会用到共用的变量,**分开封装,相应变量将得不到及时的更新。因为每次主线程进入dll的时候,相应变量是不共享内存的,dll中操作的是变量的拷贝版,而不是变量本身。**所以今后尽量将多个函数统一成一个类内的成员函数最好,坑也相对来说最少。 类的封装 类的封装,在VS中生成: 1…h文件声明类及内部成员 2…cpp文件定义函数及变量 .h文件包含内容 #pragma once #ifndef __COMANGLE_H__ #define __COMANGLE_H__ #include "windows.h" #include <stdio.h> #include <tchar.h> //#ifdef _WIN32 //#ifdef CCA_API //这个在哪里定义了? #define CCA_API __declspec(dllexport) //#else //#define CCA_API __declspec(dllimport) //#endif //#else //#define CCA_API __attribute__ ((visibility("default")

Electron调用C++的DLL

六月ゝ 毕业季﹏ 提交于 2019-12-10 14:47:48
1. 安装ffi-napi npm install ffi-napi 2. c++ dll 注意,若electron是X64的,则dll也应为X64,同理32位。 myAddDll是c++的dll名称,funAdd是其中的一个函数 3. js脚本 numA和numB是两个input文本框,CalcButton是按钮 4. 拷贝myAddDll.dll 将myAddDll.dll拷贝至electron项目根目录下的dll文件夹,执行: npm start 完整源码 来源: https://www.cnblogs.com/fansite/p/12016361.html

C#调C++生成的dll报0x800736B1错误

£可爱£侵袭症+ 提交于 2019-12-09 18:55:29
这个错误看上去好像是 C++ DLL库本身的问题,其实并不尽然。由于使用了混合模式编译托管 DLL ,所以该 DLL 又会用到非托管的 CRT ( C Run-Time )库。如果机器上没有安装这些被使用到的运行时组件,就会产生类似 HRESULT: 0x8007 的错误。 要注意的是,如果你编译 C++ 托管程序集的时候使用的是 Debug 配置的话,生成的 DLL 需要调用的就是 CRT 对应的 debug 版本( msvcr80d.dll 及 msvcm80d.dll 等 )而不是(msvcm80.dll及 msvcp80.dll等)。了解生成的 DLL 到底是 Debug 还是 Release 版本最简单的方法是用文本编辑器打开该 DLL 文件,找到以下类似的内容(一般位于文件末尾处): < assembly xmlns = "urn:schemas-microsoft-com:asm.v1" manifestVersion = "1.0" > < dependency > < dependentAssembly > < assemblyIdentity type = "win32" name = "Microsoft.VC80.DebugCRT" version = "8.0.50608.0" processorArchitecture = "x86"

DLL导出类避免地狱问题的完美解决方案 (转)

不羁的心 提交于 2019-12-09 11:17:51
备注:在设计导出类时,在网上找到了这篇文章,非常的好,收藏了!网址: http://club.topsage.com/thread-497586-1-1.html DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序。作为一名面向对象的程序员,希望DLL可以导出类,以便在类的层次上实现复用。所幸的是,DLL确实也可以导出类。 然而事实却没这么简单,导出类的DLL在维护和修改时有很多地方必需很小心,增加成员变量、修改导出类的基类等操作都可能导致意想不到的后果,也许用户更新了最新版本的DLL库后,应用程序就再也不能工作了。这就是著名的DLL Hell(DLL地狱)问题。 DLL地狱问题是怎么产生的呢?看下面的例子,假设DLL有一个导出类ClassD1: class ClassD { public: int GetInt(); private: int m_i; }; int ClassD::GetInt() { return m_i; } 应用程序使用现在的代码来使用这个类: ClassD d; printf(“%d”, d.GetInt()); 程序进行正正常,没有什么问题。后来DLL需要升级,对ClassD进行了修改,增加了一个成员变量,如下: class ClassD // 修改后

如何把DLL封装为COM组件供C++程序调用

时光总嘲笑我的痴心妄想 提交于 2019-12-09 04:13:19
需要将C#部分的接口提取出来,导出到COM,然后C++通过COM来调用它。 using System; using System.Runtime.InteropServices; namespace ClassLibrary1 { [ComVisible(true)] [Guid(“F3528A0F-D34F-4A5B-9849-0DCAD6212D5A”)] public interface MyInterface { int MyMethod(int param); } [Guid(“32B922E0-FED2-40CC-A9D6-57FE3EE341E3”)] public class Class1 : MyInterface { public int MyMethod(int param) { Console.WriteLine(“Class1.MyMethod is called!”); return param + 1; } } } 定义一个接口(待会儿C++调用对象上的方法要用),然后定义了一个类(待会儿C++创建对象要用),两个GUID一个标识接口的(在C++里QueryInterface的时候用)一个标识类的(在C++里CreateInstance的时候用)。GUID可以用VisualStudio自带的工具生成,也可以自己找在线生成的网站。

WPF调用C++生成的dll文件(示例)

荒凉一梦 提交于 2019-12-09 04:10:38
注:笔者使用的VS版本为2019。 1.打开VS2019,选择文件 -> 新建 -> 项目 2、选择项目 新建项目时选择C++“控制台应用” 语言:C++ 平台:Windows 项目类型:空项目 3、添加C++代码 源文件 -> 添加 -> 新建项 -> C++文件(.cpp) C++代码如下 #include <iostream> using namespace std; int Add(int a, int b) { return a + b; } 4、添加模块定义文件 源文件 -> 添加 -> 新建项 -> 模块定义文件(.def) 添加代码如下 LIBRARY Project1.dll EXPORTS Add 项目目录结构如下 5、生成dll文件 1)设置生成文件类型 2)选择C++项目右键 -> 生成,生成成功之后在Debug文件夹中获得Project1.dll文件 6、WPF调用C++生成dll类库文件 1)把Project1.dll文件复制到WPF项目目录\bin\Debug下 2)添加命名空间 using System.Runtime.InteropServices; 3)添加C#代码如下 [DllImport("Project1.dll", EntryPoint = "Add", CallingConvention = CallingConvention

WPF调用MFC DLL总结

杀马特。学长 韩版系。学妹 提交于 2019-12-09 04:06:36
就这段时间处理在wpf下调用MFC DLL所遇到的种种问题,与大家一起分享一下,与大家一起进步。 准备条件: 我手中有一个mfc dll文件,该文件相当于一个图形界面控件。它有一个导出函数,该导出函数需要一个父句柄(hwndParent)的输入。同时,返回该控件的对象指针。 同时,我手中还有关于这个控件的一些纯虚头文件,以及继承子类的一些实现。 第一次尝试: 之前已有听说,wpf下是不能使用mfc dll的,wpf中不存在句柄的概念。但是,工作上要求,必须得测试一下,不行得给出确切的不行的原因。 首先,要说明一下的是wpf是有个主窗口父句柄的。可以用IntPtr handle = new WindowInteropHelper(this).Handle;方法得到。 刚开始时,我是将那些关于控件类的纯虚头文件全部转换成wpf的类文件。但是,发现一个问题,wpf的抽象类是不允许声明抽象类的指针类型的。这样,我调用dll导出函数的返回值就无法保存下来。更不用说调用其中的一些方法了。 而且这样做的另外一个问题是,很有可能MFC的类模型,与wpf不相同,如果是这样的话,那么类中对应成员函数的内存指针也有可能不同,那么我调用wpf中类成员方法,跟调用mfc类成员方法肯定是不一样的。所以得以验证这种方法是不可行的。 第二次尝试: 就在这个时候,我想到让dll的创建者,给我再度封装,只提供给我接口

C#.NET 封装自定义组件(控件)Dll

纵饮孤独 提交于 2019-12-09 03:56:23
封装自定义控件很简单,没什么技术含量,这里通过封装自定义的数字文本框实例简单总结一下: 【1】新建自定义控件库 -- Windows Forms Control Library 【2】添加自定义组件 -- Component Class 【3】继承TextBox,添加KeyPress事件,代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinForms.SelfControl { /// <summary> /// 数字文本框 -- 如果生成的Dll在工具箱中导入不了,可以直接将Dll拖入 /// </summary> public partial class TextBoxNumber : TextBox {

C#引用dll生成的控件

风格不统一 提交于 2019-12-09 03:56:10
C# 引用 dll 生成的控件 自定义了一些控件,并封装成了 dll 文件,把此控件在工具箱中显示的方法: 1 、首先右击解决方案中的‘引用’,选择‘添加引用’,如下图: 2 、选择封装控件的 dll 文件,如下图: 3 、在工具箱中右击,选择‘选择项’,如下图: 4 、选择‘ .NET Framework 组件’选项卡,点击‘浏览’按钮,选择封装控件的 dll 文件,如下图: 5 、点击‘确定’,可以在‘ .NET Framework 组件’选项卡看到添加的控件,如下图: 6 、在工具箱中同样可以看到控件,如下图: 来源: CSDN 作者: sygdp21 链接: https://blog.csdn.net/sygdp21/article/details/37568829