VS中静态及动态链接库的简单创建(二)

2.建立动态链接库DLL

建立在win32平台下dll的创建,创建win32项目,之后选择dll。创建过程如下图。

创建头文件lib.h及lib.cpp。源码如下:

#ifndef LIB_H
#define LIB_H

extern "C" int __declspec(dllexport) add(int, int);

#endif
#include "lib.h"
int add(int x,int y)
{
	return x+y;
}

同样,生成后可以在Debug文件中看到*.dll文件。之后再该“解决方案”下,即VC6.0中所说的同一工作区中,创建新项目libCall工程,工程仅包含一个main.cpp文件,演示了如何将静态链接库调用的方法,源码如下:

#include <stdio.h>
#include <Windows.h>
typedef int(*lpAddFun)(int ,int );//宏定义函数指针类型
int main(int arge,char *argv[])
{
	HINSTANCE hDll; 
	lpAddFun addFun;
	hDll = LoadLibrary("..\\dllTest\\Debug\\dllTest.dll");
	if (hDll != NULL)
	{
		addFun = (lpAddFun)GetProcAddress(hDll,"add");
		if (addFun != NULL)
		{
			int result = addFun(2,3);
			printf("2+3=%d",result);
		}
		FreeLibrary(hDll);
	}
	return 0;
}


将dllCall设置为“启动项目”后,运行。发现出错,错误信息:“LoadLibraryW”: 不能将参数 1 从“const char [29]”转换为“LPCWSTR”
1>          与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换。
首先,LoadLibrary实际是LoadLibraryW进行的调用,因为在VS2005以后,编码方式默认为Unicode,部分函数在使用时默认调用Unicode方式。所以要使用LPCWSTR进行调用,将加上强制转换后,运行仍不正常。LoadLibraryA和LoadLibraryW分别对应ASCII和宽字节版本。LoadLibrary就等同于LoadLibraryA或LoadLibraryW,看其定义:

#ifdef _Unicode
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif

但是使用LoadLibraryW没有进行正确输出,应该是将字符串判断为ANSI格式了,改为

hDll = LoadLibraryA(LPCSTR("..\\dllTest\\Debug\\dllTest.dll"))后,程序正常。注意:此前dllTest项目要进行编译后,才会生成*.dll文件。生成后可在Debug文件中看到有dllTest.lib存在.
之后编译,可以正常运行,输出结果。
关于extern "C" int __declspec(dllexport)
的解释见文章点击打开链接

当然,也可以不使用该种形式,只在lib.h中正常声明add函数,同时在dllTest下创建一个新的lib.def文件,内容如下:

LIBRARY dllTest
EXPORTS
add @1

同时在

addFun = (lpAddFun)GetProcAddress(hDll,"add");//将第二个参数改为MAKEINTERSOURCEA(),参数为@n的值
addFun = (lpAddFun)GetProcAddress(hDll,MAKEINTRESOURCEA(1));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值