vc6.0下调用dll文件提供的函数接口和全局变量-尊龙官方平台

vc6.0下调用dll文件提供的函数接口和全局变量

el/2024/3/25 15:33:54

复习一下vc: 本文摘自: http://gauzeehom.iteye.com/blog/1031130


函数接口:

首先把生成的dll文件(如regulardll.dll和regulardll.lib)拷贝到当前工程所在文件夹,调用有两种方法:

1)动态方法:
使用loadlibrary和getprocaddress等函数,例
typedef void (*lpfun)(void);
hinstance hdll;
hdll = loadlibrary("regulardll.dll");
if (null==hdll) {
messagebox("dll load failed!");
}
lpfun pshowdlg = (lpfun)getprocaddress(hdll,"showdlg");
if (null == pshowdlg) {
messagebox("load function \"showdlg\" failed!");
}
pshowdlg();*/

2)静态声明方法:
创建dll的工程中,函数声明和定义时用 _stdcall 修饰,例 
void _stdcall showdlg(void){...} 
在调用dll的工程的文件中,在文件头部声明库和函数,如下例
#pragma comment(lib,"regulardll.lib")
void _stdcall showdlg(void);
调用时直接showdlg()就可以了。
以上两种方法在vc6.0中调试成功,保证可用!

有的文章中说这样声明即可:
#pragma comment(lib,"regulardll.lib")
void showdlg(void); 
但在vc6.0下会报找不到函数showdlg的错误,不知是不是我没有设置好?

全局变量(访问dll文件中的全局变量)

在创建dll的工程中,在头文件中这样声明:
//lib.h
#ifndef _lib_h
#define _lib_h
#ifdef dll_file
extern int dllglobalvar;
#else
extern int _declspec(dllimport) dllglobalvar; 
#endif

在创建dll的工程的cpp文件中先定义dll_file,再定义该变量,如下例:
//lib.cpp
#define dll_file
#include "lib.h"
int dllglobalvar; //define
bool apientry dllmain(handle hmodule, dword ul_reason_for_call, lpvoid lpreserved)
{
switch(ul_reason_for_call) {
case dll_process_attach:
dllglobalvar = 100; // initialization when dll attached
break;
……
}
int _stdcall getglobalvar()
{
return dllglobalvar; // use the global variable
}

在调用dll文件的工程中,需要访问该全局变量时,声明如下:
#include "..\\lib.h"
#pragma comment(lib,"dlltest.lib")
然后可以当作普通的全局值变量使用和修改了!
printf("%d \n", dllglobalvar);
dllglobalvar = 234;
printf("%d \n", dllglobalvar);


http://www.ngui.cc/el/5126746.html

相关文章

企业微信接入时序图

企业微信接入时序图 企业管理员 企业微信应用市场 第三方应用后台 企业微信api 管理员进入应用市场 管理员进入应用授权页面 管理员确认并同意授权 1.授权成功,回调临时授权码 auth_code 临时授权码 2.使用临时授权码获取永久授权码及授权信息 3.存储永久授权码等信…

java常用数据类型转换笔记

这里写自定义目录标题 字符串相关bigdecimal 与 string 日期相关long 与 date 字符串相关 bigdecimal 与 string /*由数字字符串构造bigdecimal的方法 *设置bigdecimal的小数位数的方法 */ import java.math.bigdecimal; //数字字符串 string strbd"1048576.1024&q…

fisco bcos 区块链平台笔记

在ubuntu18上搭建了微众银行 fisco bcos 区块链平台,将一些事项记录为笔记以便查阅: 1、安装指引 2、教程 3、使用手册 常用操作笔记 启动fisco bcos链 #启动所有节点 bash nodes/127.0.0.1/start_all.sh#检查进程是否启动 ps -ef | grep -v grep | g…

斐波那契数列-1

力扣地址 斐波那契数列: 时间复杂度: 空间复杂度: 这题和青蛙跳台阶-2初始值稍有不同,需要审题清楚,状态转移方程是一样的 class solution { public:int fib(int n) {if (n < 1) return n;int first 0;int sec…

0~n-1中缺失的数字-2

力扣地址 题目描述有点问题,每个数字都在范围0~n之内,而不是0~n-1 遍历: 缺失的中间部分 class solution { public:int missingnumber(vector& nums) {int len nums.size();if (nums[0] ! 0) retu…

二叉树的深度-1

力扣地址 递归: /*** definition for a binary tree node.* struct treenode {* int val;* treenode *left;* treenode *right;* treenode(int x) : val(x), left(null), right(null) {}* };*/ class solution { public:int maxdepth(treenode* r…

和为s的连续正数序列-2

力扣地址 双指针 class solution { public:void insertvec(vector>& ret, int low, int high) {vector tmp;tmp.reserve(high - low 1);for (int i low; i < high; i) {tmp.push_back(i);}ret.push_back(tmp);}vector

滑动窗口的最大值-1

力扣地址 用deque维持单调递减队列 deque中存入数组位置 class solution { public:vector maxslidingwindow(vector& nums, int k) {deque dq;vector res;for (int i 0; i < nums.size(); i) {while (!dq.empty() &…

左旋转字符串-2

力扣地址 切片 class solution { public:string reverseleftwords(string s, int n) {return s.substr(n) s.substr(0, n);} };

平衡二叉树-2

力扣地址 后序遍历 /*** definition for a binary tree node.* struct treenode {* int val;* treenode *left;* treenode *right;* treenode(int x) : val(x), left(null), right(null) {}* };*/ class solution { public:bool isbalanced(treenode* root) …
网站地图