c语言获取调用者的函数指针,C语言 函数指针二(正向调用)

//函数指针做函数参数

#include

#include

#include

#include

/*

函数指针做函数参数

实现了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 = ;

void *handle=NULL;

//准备发送报文

char *sendstr = "dddddd";

int buflen1 = strlen(sendstr) + ;

//接受报文

char *revstr = NULL;

int buflen2 = ;

//严重注意(第一次花费了半小时):在使用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!=)

{

printf("句柄初始化失败!\n");

goto AAA;

}

ret = pf2(handle, (unsigned char*)sendstr, buflen1);

if (ret!=)

{

printf("报文发送失败!\n");

}

ret = pf3(handle, (unsigned char**)&revstr, &buflen2);

if (ret!=)

{

printf("报文接受失败!\n");

}

//打印接受的报文

printf(revstr);

//释放报文内存

free(revstr);

ret = pf4(&handle);

if (ret != )

{

printf("释放句柄失败!\n");

}

AAA:

system("pause");

}

c语言获取调用者的函数指针,C语言 函数指针二(正向调用)_第1张图片

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

动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include #include

C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。

//函数fun功能:用函数指针指向要调用的函数,并进行调用. #include double f1(double x) { return x*x; } double f ...

C语言函数指针(转载)

二.通常的函数调用 一个通常的函数调用的例子:/* 自行包含头文件 */void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */int main(int a ...

C语言函数指针 和 OC-Block

C语言函数指针 和 OC-Block 一. C语言函数指针 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/2967037 ...

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

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

C语言函数指针基础

本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

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

本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声 ...

“对外部(局部)变量的访问”是C语言函数指针的最大弱点

1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include #include /* 结构体定义 */ struc ...

Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针

版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

随机推荐

GMap.Net开发之自定义Marker

上一篇文章介绍了如何在WinForm和WPF中使用GMap控件,这篇介绍下GMap中Marker的使用. 自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap ...

Servlet 利用Session实现不重复登录

import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.It ...

css 单行文本居中显示,多行文本左对齐

父级元素 text-align:center; 自级元素 text-align:left; display:inline-block;

selenium 使用xpath定位不到

[USACO17FEB]Why Did the Cow Cross the Road II S

题目描述 The long road through Farmer John's farm has  crosswalks across it, conveniently numbered  (). ...

使用JDOM解析xml文档

一.使用JDOOM解析xml文档 准备工作 1.下载JDOM.jar 包 解析代码如下 import org.jdom2.Attribute; import org.jdom2.Document; i ...

23.HashMap

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...

http状态码204/206/200/302/303/307

HTTP的状态码有很多种,主要有1xx(临时响应).2xx(成功).3xx(已重定向).4xx(请求错误)以及5xx(服务器错误)五个大类,每个大类还对应一些具体的分类.平时我们接触比较多的是200. ...

hbuilder header消失

hbuilder的header在google浏览器中调试能正常显示,但是发布到app安装到手机后headr不显示.

你可能感兴趣的:(c语言获取调用者的函数指针)