C语言 函数指针二(正向调用)

//函数指针做函数参数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>

/*
函数指针做函数参数
实现了2大功能:1.定义了一个指针类型,分配了4个字节大小的内存空间
2.规定了调用函数的参数列表,和返回值

正向调用:通过window自带系统函数库调用dll文件,获取dll文件中的函数地址,执行函数
反向调用:通过函数指针,在另一个函数里调用别的函数
*/

void main(){
    //正向调用
    //定义句柄----HINSTANCE头文件是Windows.h
    HINSTANCE hinstance;
    //定义函数指针类型
    typedef int(*SocketInitType)(void** /*out*/);
    typedef int(*SocketSendType)(void *, unsigned char *, int );
    typedef int(*SocketRevType)(void *, unsigned char **, int *);
    typedef int(*SocketDestory)(void **);
    int ret = 0;
    void *handle=NULL;
    //准备发送报文
    char *sendstr = "dddddd";
    int buflen1 = strlen(sendstr) + 1;
    //接受报文
    char *revstr = NULL;
    int buflen2 = 0;
    //严重注意(第一次花费了半小时):在使用LoadLibrary宏定义的时候一定要设置字符集是未设置,不然c语言编译器不识别文件路径
    //具体设置:项目右键--属性--配置属性--常规--字符集--未设置
    hinstance = LoadLibrary("E:/L001.dll");
    if (hinstance==NULL)
    {
        printf("获取文件地址失败!\n");
    }
    //获取函数地址
    SocketInitType pf = (SocketInitType)GetProcAddress(hinstance, "cltSocketInit");
    if (pf==NULL)
    {
        printf("获取函数指针失败!\n");
        return;
    }
    SocketSendType pf2 = (SocketSendType)GetProcAddress(hinstance, "cltSocketSend");
    if (pf2 == NULL)
    {
        printf("获取函数指针失败!\n");
        return;
    }
    SocketRevType pf3 = (SocketRevType)GetProcAddress(hinstance, "cltSocketRev");
    if (pf3 == NULL)
    {
        printf("获取函数指针失败!\n");
        return;
    }
    SocketDestory pf4 = (SocketDestory)GetProcAddress(hinstance, "cltSocketDestory");
    if (pf4 == NULL)
    {
        printf("获取函数指针失败!\n");
        return;
    }
    ret = pf(&handle);
    if (ret!=0)
    {
        printf("句柄初始化失败!\n");
        goto AAA;
    }
    ret = pf2(handle, (unsigned char*)sendstr, buflen1);
    if (ret!=0)
    {
        printf("报文发送失败!\n");
    }
    ret = pf3(handle, (unsigned char**)&revstr, &buflen2);
    if (ret!=0)
    {
        printf("报文接受失败!\n");
    }
    //打印接受的报文
    printf(revstr);
    //释放报文内存
    free(revstr);
    ret = pf4(&handle);
    if (ret != 0)
    {
        printf("释放句柄失败!\n");
    }
AAA:
    system("pause");
}

时间: 2024-10-13 02:10:01

C语言 函数指针二(正向调用)的相关文章

C语言 函数指针三(反向调用)

动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //定义加密函数指针类型 typedef int(*PDesEncSocket)(char *, int , char **, int *); //定义解密函数指针类型 typedef int(*PDesDecSocket)(char *, int

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

深入理解C语言函数指针(转)

本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声明也可写成:void myFun( int ); int main() { myFun(100);//一般的函数调用 return 0; } void myFun(int x) { printf("myFun: %d\n",x); } 我们一开始只是从功能上或者说从数学意义上理解myFun

C语言 函数指针的应用

简单的介绍下C语言函数指针的用法. 函数指针的声明: char (* FunPtr)(char); 或者char (* FunPtr)(char ch);  (声明类型个形参类型根据实际情况更改) 例: 1 #include"stdio.h" 2 3 char myFun(char ch) 4 { 5 printf("myFun is called, your char is %c.\n",ch); 6 return 'w'; 7 } 8 9 void main()

c语言函数指针实例

如果使用typedef 是这样的 //可以把一个小写字母变成大写 //char (*pFun)(char); typedef char (*PTRFUN)(char); PTRFUN pFun; char glFun(char a){ return a & 223;} void print(int a,PTRFUN call){ cout<<call(a)<<endl;}void main() { pFun = glFun; print('a',pFun);} 如果不使用t

c语言函数指针

1 void PrePrintOrTree(struct TreeNode* root, void (*WorkPrint)(double)){ 2     struct TreeNode* index = root; 3     if (root == NULL){ 4         return; 5     } 6     PrePrintOrTree(root->lchild,WorkPrint); 7     (*WorkPrint)(root->value); 8     Pre

Python Cookbook(第3版)中文版:15.12 将函数指针转换为可调用对象

15.12 将函数指针转换为可调用对象? 问题? 你已经获得了一个被编译函数的内存地址,想将它转换成一个Python可调用对象,这样的话你就可以将它作为一个扩展函数使用了. 解决方案? ctypes 模块可被用来创建包装任意内存地址的Python可调用对象.下面的例子演示了怎样获取C函数的原始.底层地址,以及如何将其转换为一个可调用对象: >>> import ctypes >>> lib = ctypes.cdll.LoadLibrary(None) >>

深入浅出剖析C语言函数指针与回调函数(二)

上一篇博文的地址: http://blog.csdn.net/morixinguan/article/details/65494239 这节,我们来看看函数指针与回调函数在Linux内核中的应用. 从上节我们了解到,函数指针和回调函数在开发者和用户之间的一个例子,那么这节,我将引用Linux内核中文件操作结构体来详细的说明. 我们首先来看到这个结构体,这段代码位于linux内核的include/linux/fs.h中,由于代码众多,我只截取几个最基本的例子: File_operations文件操

深入浅出剖析C语言函数指针与回调函数(一)【转】

本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn.NET/morixinguan/article/details/52451612 今天我们要搞明白的一个概念叫回调函数. 什么是回调函数? 百度的权威解释如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说