精华内容
下载资源
问答
  • 原则:1、函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用一个函数调用另一个函数的时候,就可以把被调用函数函数指针的形式作为参数传入2、回调函数callback使用...

    原则:

    1、函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用

    一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入

    2、回调函数callback使用的技术就是函数指针:

    回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:

    1). 声明;

    2). 定义;

    3). 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。

    回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。

    3、C#中用委托这种概念实现了函数指针技术而已,另外.ent提供额外的安全性,当然也损失了灵活性

    展开全文
  • 计算机等级|更新时间:2008-11-28|来源:教育联展网虽然在DLL中定义指向主程序的函数指针,看似程序逻辑有些混乱,但工程实际应用中有时却得这么干,因此简单总结一下,函数指针在开发中的应用。第一步: 创建一般的...

    09年计算机二级辅导:C++实例(DLL中如何应用函数指针与主程序交互)

    分类:计算机等级|

    更新时间:2008-11-28|

    来源:教育联展网

    虽然在DLL中定义指向主程序的函数指针,看似程序逻辑有些混乱,但工程实际应用中有时却得这么干,因此简单总结一下,函数指针在开发中的应用。

    第一步: 创建一般的动态库工程Win32s1

    第二步: 在动态库.h文件中,自定义函数指针类型,声明导出函数

    注:导出函数应用到外部主程序的相关计算与结果

    typedef float (*outFun)(int, int, int); //函数指针类型

    // typedef + 类型标识 + (指针变量名称) + (参数列表)

    SBUI_API void getProfit(outFun fun); //声明导出函数

    注:导出函数的返回类型与函数指针应用无关

    第三步: 在动态库的.cpp文件中,实现一个由外部函数执行 + 动态库函数执行的一个动作

    void getProfit(outFun fun)

    {

    int nGrossIncome = 90000; //总收入

    int nLabourCosts = 1000; //人工成本

    int nMaterialCosts = 2000; //材料成本

    double nNetProfit = fun(

    nGrossIncome,

    nLabourCosts,

    nMaterialCosts)/*求得税前利润*/

    * (1 - 0.18);

    char chNetProfit[512] = "\0";

    sprintf(chNetProfit, "当期纯利润为 %f", nNetProfit); // #include

    MessageBox(NULL, chNetProfit, "收益计算", MB_OK|MB_ICONINFORMATION);

    }

    第四步: 在主程序中实现成本计算函数 setProfit,并调用DLL函数

    float setProfit(int _nGrossIncome, int _nLabourCosts, int _nMaterialCosts)

    {

    int nSellingCosts = 5000;

    return float(_nGrossIncome - nSellingCosts - _nLabourCosts - _nMaterialCosts);

    }

    #include "dll1.h"

    #pragma comment(lib,"Win32s1.lib")

    void CTestDlg::OnButton1()

    {

    getProfit(setProfit);

    }

    展开全文
  • 如果你的DLL里全是C++的类的话,你无法在DEF(后边讲)里指定导出的函数,只能用__declspec(dllexport)导出类被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。C和C++对函数的处理方式是不同的.extern "C"是...

    第一种声明函数为导出函数(__declspec(dllexport))

    声明一个导出函数,是说这个函数要从本DLL导出。如果你的DLL里全是C++的类的话,你无法在DEF(后边讲)里指定导出的函数,只能用__declspec(dllexport)导出类

    被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那么就要使用extern "C"来说明。

    例子如下:

    创建一个dll新建一cpp填写代码如下即可编译链接得到一个dll

    extern "C" __declspec(dllexport) int Add(int a,int b)

    {

    return a+b;

    }

    再创建一win32控制台程序新建一cpp (作为测试程序)填写代码如下:

    #include

    #include

    void main()

    {

    HINSTANCE Hdll = GetModuleHandle("AddDll.dll");

    if (NULL == Hdll)

    {

    Hdll = LoadLibrary("AddDll.dll");

    }

    typedef int (*TESTDLL) (int a,int b); //定义函数指针接收咱需要的函数

    TESTDLL pAdd;

    pAdd =(TESTDLL)GetProcAddress(Hdll,"Add"); //得到地址初始化咱的函数指针

    int c = pAdd(1,3);  //调用

    cout<

    FreeLibrary(Hdll);   //在恰当的时候释放句柄。

    }

    编译链接运行结果输出c = 4

    第二种方法.def文件(模块定义文件) 是一个有.def扩展名的文本文件。它被用于导出一个DLL的函数,和__declspec(dllexport)很相似

    *.DEF文件的编写(是在dll文件中写的不是测试工程中)

    内容如下:

    LIBRARY "xxx"

    EXPROTS

    myFunction1 @1

    myFunction2 @2

    前面两行是固定格式

    "xxx"是DLL名,不带扩展名的

    第三行四行是自己的函数名,后面的@后的数字是函数序号,不论编译器将函数名改成啥样,但DLL根据序号来调用函数,

    例子如下:

    创建一个dll新建一cpp填写代码如下

    int __stdcall Add(int a,int b)

    {

    return a+b;

    }

    int __stdcall Sub(int a,int b)

    {

    return a-b;

    }

    编写def文件(vc6.0高级的编译环境可以直接添加def文件)

    在此dll工程的根目录下编写即可在此需要新建一文本文档改后缀名为def即可内容如下

    LIBRARY AddDll

    EXPORTS

    Add @ 1

    Sub @ 2

    写好只好将其添加到咱dll的工程中 工程—增加到工程---文件选择咱的def文件即可 编译链接生成目标dll

    再创建一win32控制台程序新建一cpp (作为测试程序)填写代码如下:

    #include

    #include

    void main()

    {

    HINSTANCE Hdll = GetModuleHandle("AddDll.dll");

    if (NULL == Hdll)

    {

    Hdll = LoadLibrary("AddDll.dll");

    }

    typedef int (__stdcall *TESTDLL) (int a,int b); //定义函数指针接收咱需要的函数

    TESTDLL pAdd;

    pAdd =(TESTDLL)GetProcAddress(Hdll,MAKEINTRESOURCE(2));.//调用序号为2的函数

    //MAKEINTRESOURCE的作用:是把一个"数字形ID",转化为"字符串".

    //但是执行前后,输入的数据的内容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.

    int c = pAdd(1,3);  //调用

    cout<

    FreeLibrary(Hdll);

    }

    简单的两种方法。结合网上资料与百度。

    展开全文
  • dll的堆栈约定规则是stdcall方式,那么为什么vb也可以正确地调用dll中的函数呢?dll怎么知道调用它的不是c语言而是vb?
  • In a Windows DLL, the wrapper functions are the exported functions of the DLL. Let me show a small example of this. C++ class description in file cls.cpp class cls { public: cls(); ~cls(); int ...

     

    原文链接: http://www.coopknow.com/papers.asp?paper=2

    Many people incorrectly think the C and C++ languages are the same. Although C++ evolved from C and C++ compilers can compile C, the functionality of the two languages is different. C++ is a complete object-oriented language. It supports inheritance, information hiding, polymorphism and operator overloading. C does not have these features.

    C++ was originally implemented as a pre-processor to a standard C compiler. The pre-processor parsed the C++ source code and generated C source. A C compiler then compiled the generated source code. There was, however, a problem generating the C source. C++ supports polymorphism (having two or more functions with the same name) but C does not allow two functions to have the same name. They solved this by invoking a pre-processor. It generated a C function name by combining the specified C++ function name and the return and argument types of the function. This solution was called "name mangling." Although modern C++ compilers do not use the pre-processor to generate C source anymore, they still mangle function names. This technique works great so long as all functions involved are C++ functions.

    Microsoft Windows DLL external functions do not conform to the C++ naming convention. Their names cannot be mangled by C++ and they do not use the C argument standard. They must be of type PASCAL. In addition, Windows does not support the C++ object/class structure. It just does not know what to do with a pointer to an instantiated object. This does not mean that you cannot use C++ in a DLL, you just need to use a special technique called "wrapping."

    C++ Wrappers

    This is not a new problem in the C/C++ world. When programmers started using C++ to enhance systems written in C, they needed some way to allow C functions (functions that had no knowledge of C++ calling conventions) to call the methods of C++ objects. They wrote wrapper functions to do this. A wrapper functions is a C function that is compiled as if it were a C++ function. Because the wrapper is compiled as a C++ function, it understands the C++ calling conventions. Since it is a C function, other C functions can call it. Anytime a non-wrapper C function needs to call a C++ class method, it calls the wrapper function and requests the wrapper to make the call for it.

    Sample Wrapper Functions

    In a Windows DLL, the wrapper functions are the exported functions of the DLL. Let me show a small example of this.
    C++ class description in file cls.cpp

    class cls
    {
    public:
    cls();
    ~cls();
    int doit(int x);
    };
    C wrapper functions in file clswrap.cpp:
    extern "C"
    {
    void * PASCAL _extern CLSConstruct();
    void PASCAL _extern CLSDestruct(void *Cls);
    int PASCAL _extern CLSDoit(void *Cls,int x);
    };
    void * PASCAL _extern CLSConstruct()
    {
    cls *obj;

    obj = new cls;
    return(void *)obj))
    }
    void PASCAL _extern CLSDestruct(void *Cls)
    {
    cls *obj;
    obj = (cls *)cls;
    delete obj;
    }
    int PASCAL _extern CLSDoit(void *Cls,int x)
    {
    cls *obj;
    obj = (cls *)Cls;
    return(obj->doit(x));
    }
    C function calling the wrapper in file use.C
    use()
    {
    void *cls;
    int x;
    cls = CLSConstruct();
    x = CLSDoit(cls,1);
    CLSDestruct(cls);
    }

    In VB you can use the following:
    Declare Function CLSConstruct Lib "cls.dll" As Long
    Declare Sub CLSDestruct Lib "cls.lib" (ByVal cls as Long)
    Declare Function CLSDoit Lib "cls.lib" (ByVal x as Integer) As Integer

    Dim cls as Long
    Dim r As Integer
    cls = CLSConstruct
    r = CLSDoit(cls,2)
    CLSDestruct cls

    Implementation Notes:

    1. The constructor wrapper function must return a pointer to the object that it instantiated. I use this pointer in all subsequent calls to the wrapper functions. I normally have it as the first argument of all other class method wrapper functions.
    2. I name the wrapper functions with the class name as the first part of the name and the method name as the second part.
    3. If the class method can take different arguments, then I write individual wrapper functions with unique names for each method.

    Conclusion

    If you want to write Windows DLL's in C++ you certainly can. You just need to write wrapper functions to export the function names to other Windows applications. I recommend that you only use C++ if you plan to use object-oriented programming techniques. If all you need is a simple function that you can easily write in C, why add the complexity of C++ and wrappers?

    展开全文
  • 篇内容分两部分:第一部分是 QT在 windows 上 DLL的导出和调用; 第二部分是 QT在 linux 上 DLL(os)导出和调用; ...在类添加你成员函数,成员变量 就可以了,编译生成的dll就导出类了;
  • C++ librarylibrary.h#ifndef __LIBRARY_H__#define __LIBRARY_H__//exports.def#ifdef __cplusplus //__cplusplus是cpp自定义一个宏extern "C" { //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++#...
  • c语言怎么调用dll文件

    万次阅读 2013-03-06 15:39:09
      dll调用: (1)一般动态链接库有头文件...使用时候需要引用文件加上#pragma comment (lib, "xxx.lib")就可以,然后可以调用dll里面函数等 (2)如果只有lib,h文件,那这是静态链接库,同上面一样
  • C语言创建dll及Labview实现调用

    千次阅读 2017-03-20 16:19:15
    本文将详细记录使用C语言创建一个dll库文件,然后在Labview进行调用的过程。 一、目标用C语言创建两个函数,分别用于获取两个整数较大、较小值。函数命名:getMax,getMin。生成dll文件后,在Labview中将这两...
  • 因为需要一段C语言实现代码,无奈不了解其个原理,想翻译为C#或python却有心无力,没有办法只有将C语言代码写成api函数,生成DLL,在C#中调用就算了吧 首先要有一个dll文件,其代码如下: encore.c Code 1#...
  • 如果你的DLL里全是C++的类的话,你无法在DEF(后边讲)里指定导出的函数,只能用__declspec(dllexport)导出类被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。C和C++对函数的处理方式是不同的.extern "C"是...
  • [转]在C#中调用C语言函数(静态调用Native DLL,Windows & Microsoft.Net平台) 原文:https://blog.csdn.net/yapingxin/article/details/7288325 对于不太了解.Net人,如果想要了解.Net,我必须给他介绍...
  • Python中调用C语言函数

    2019-07-25 10:51:41
    ctypes模块提供了和C语言兼容数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何修改。也正是如此奠定了这种方法简单性。 示例如下 实现两数求和C代码,保存为add.c //sample C file to add ...
  • 项目delphi程序调用c语言的dll一切正常,退出时出现错误access violation at 0x... 网上查到貌似与调用约定有关,试验将delphi声明copy过来stdcall换成cdecl,成功解决。 dll函数声明: interface ...
  • c语言: typedef char * (__stdcall *MYPROC)(char * s, char * rs);//函数原型,s:传入数据,rs:返回数据。 HINSTANCE hinstLib; MYPROC send; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; WCHAR...
  • C#调用C语言生成dll using System; using System.Runtime.InteropServices; //与导入dll有关命名空间 ... //[导入dll,dll与exe在同一个文件夹下]导入dll中getCpuID1函数 [DllImport("CPUID32DLL.dll...
  • 4、在main.c写入一个简单的函数,内容如下: __declspec(dllexport) int mymax(int a,int b){ return a + b; } 5、编译生成。 6、在项目的目录有dll和lib两个生成好的文件。 第二部分:在新建项目使用...
  • 对于不太了解.Net人,如果想要了解.Net,我必须给他介绍P/...简单地说,就是在.Net中调用本地代码(Native code)一种解决方案。所谓“本地代码”是相对于托管代码(Managed code)来说。 P/Invoke实在是...
  • C语言调用动态库函数的两种方式 方式一.隐式调用 ...在程序运行过程中,lib将dll中需要用到的函数映射到对应的内存空间。 #pragma comment(lib, "./mydll.lib") 方式二.显示调用 ...
  • 关于在C#中调用C语言函数的具体技术P/Invoke,在之前那篇文章《[科普小短文]在C#中调用C语言函数有介绍,不了解读者可以去看一下,这里不多介绍了,直接来看我们例子。 一、准备动态
  • C和C#作为日常工作很常见两种开发语言,难免会遇到彼此需要调用的情况。本章重点讲一下关于C#调用C的dll的经验,希望能给有用到朋友以借鉴。 首先制作C版本的dll,因为我VS2017有点小故障,无法创建Win32...
  • c语言调用.lib,.dll,.a,.so中的函数不稀奇,可是你知道怎么调用目标文件.obj文件中的函数吗?
  • 调用C语言编写的DLL文件

    千次阅读 2009-12-11 15:18:00
    1、 使用Visual C++ 6.0编写和链接DLL打开Visual C++ 6.0集成开发环境,新建一个Win32 Dynamic-Link ...源文件中的内容如下:__declspec(dllexport) int max(int x,int y) /* 比较两个整型变量大小的函数max */{ if
  • 在Delphi中调用C语言编写的DLL

    千次阅读 2004-08-11 18:53:00
    1、 使用Visual C++ 6.0编写和链接DLL打开Visual C++ 6.0集成开发环境,新建一个Win32 Dynamic-Link ...源文件中的内容如下:__declspec(dllexport) int max(int x,int y) /* 比较两个整型变量大小的函数max */{ 
  • 本文实例讲述了Python实现的调用C语言函数功能。分享给大家供大家参考,具体如下: 实例参考python cookbook 中的15.1节中的例子P612页 先把 c文件编译成 so文件 gcc a.c -fpic -shared -o lib.so 通过上面编译...
  • 简单地说,就是在.Net中调用本地代码(Native code)一种解决方案。所谓“本地代码”是相对于托管代码(Managed code)来说。 P/Invoke实在是一个非常棒(awesome)特性。本来,.Net 这项技术...
  • 3、调用MatlabM函数转化成c语言的函数。在本文当中重点讲解第二种方法,调用MatlabM函数转换成DLL文件的形式。 在我自己编写之前,查看了很多的文献,但是每个文献所应用的Matlab的版本不一样,很多数学函数...
  • c语言制作dll

    千次阅读 2007-03-05 10:12:00
    "extern C"表示,可以使用其他编程语言访问dll中的函数。动态连接库的连接方法:(共两种)1,隐式连接:只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以。例如:
  • 动态链接库(Dynamic Link Library 或者 Dynamic-link ... DLL 文件,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。从语言方面来说就是可以在一定程度上使不同的语言之间实现相互调用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 438
精华内容 175
关键字:

c语言调用dll中的函数

c语言 订阅