//函数指针做函数参数
#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语言 函数指针三(反向调用)
动态库代码 //简单的动态库开发----报文发送 #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不显示.