WIN7+VS2010 制作与调用DLL

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************


嗯哼~之前帮老师做的那个模块,不用做了=  =。

做了近十天,结果跑了13分钟WIN7+VS2010 制作与调用DLL

人家,秒级别的,甚至毫秒级的速度。。。。

哎。。WIN7+VS2010 制作与调用DLL。。

跪拜ING,2000+ X 2000+阶矩阵,有乘法,点乘,转置,求逆,一系列操作,

而且,乘法至少要进行40+次,求逆也要进行40+次,

这是如何进行秒级出结果的= =。。

或者,它们压根就没有通过矩阵来计算。

唉,不想了。


老师,是用C#做的,当时要我将这个函数模块 做成DLL,给他,告诉他参数和返回。

话说,我不会做DLL,表示羞愧INGWIN7+VS2010 制作与调用DLL

于是乎,各种搜索加测试,终于搞懂了。


对了,我的环境是  WIN7 + VS2010 


1.生成DLL文件

恩,首先,打开VS2010新建一个WIN32项目,名称max_2(当然,你想叫啥就叫啥):

WIN7+VS2010 制作与调用DLL


弹出对话框,点击-> 下一步

然后选择DLL,并点击空项目,然后选择完成:

WIN7+VS2010 制作与调用DLL


然后,右键点击项目名称(右方),选择添加->新建项:

WIN7+VS2010 制作与调用DLL


然后,找 .cpp 文件,输入文件名称,建立:

WIN7+VS2010 制作与调用DLL


然后,填写你的代码,这里我就以 比较两个数大小为例:

在.cpp中填写:(注意__declspec 和 __cdecl 都是两个 _ )

extern "C" __declspec(dllexport) int __cdecl max( int a ,int b )
{
	return	a > b ? a : b;
}

——这里的extern "C" 是为了,防止后面可能出现:能装载DLL文件,但是找不到函数的情况。

extern "C" 的意思是:告诉C++编译器这个函数,采用C风格编译。这个主要看你怎么调用,用C风格调用还是用C++风格调用。(详细点也可以看这个 -> http://blog.csdn.net/zhongjling/article/details/8088664

——这里的__declspec(dllexport) 是生成dll必用的东东,如果不这么写,也可以通过新建一个.def文件来替代。

—— __cdecl  作用是 指定VC中的函数调用规则是__cdecl。由于VC环境下,默认调用规则就是__cdecl,所以也可以不写。当然,除了__cdecl还有  约定调用WIN32 API函数的 __stdcall , 对性能要求非常高的情况下用的 __fastcall。

这些的详细本文不会详细说明,可以看 -> http://blog.csdn.net/kesalin/article/details/2447368

and then 比较大小的函数,类型,名称,内容就无须多说了吧?(重点是制作DLL)


在这里,我选择制作release的 dll ,

选择  生成 -> 配置管理器:

WIN7+VS2010 制作与调用DLL


然后,在 活动解决方案配置,选择 Release:

WIN7+VS2010 制作与调用DLL


点击关闭,然后生成解决方案。

然后,在生成的文件根目录下,找到Release文件夹,

打开就可以看到dll文件了:

WIN7+VS2010 制作与调用DLL


OK,dll 文件生成成功!WIN7+VS2010 制作与调用DLL




2. 调用DLL

接下来,就是如何在VS下调用dll。

新建一个WIN32 控制台应用程序(取消选择建立解决方案):

WIN7+VS2010 制作与调用DLL


然后,在弹出来的窗口中,点击下一步,然后选择 控制台应用程序,空项目:

WIN7+VS2010 制作与调用DLL


同生成一样,新建一个.cpp文件,

然后在里面填写:

#include <Windows.h>
#include <stdio.h>

typedef int ( __cdecl *findMax ) ( int a , int b );

int main()
{
	findMax fmax;
	HMODULE hLib;
	hLib = LoadLibrary(TEXT("max_2.dll"));
	fmax = ( findMax )GetProcAddress( hLib , "max" );
	if( hLib == NULL )
	{
		printf("DLL获取失败\n");
	}
	if( fmax == NULL )
	{
		printf("函数获取失败\n");
	}
	
	int a,b;
	while( scanf("%d%d",&a,&b)!=EOF )
	{
		if( !a && !b )	break;
		printf("%d 与 %d 之间,较大的为:%d\n",a,b,fmax(a,b));
	}
	system("pause");
	return 0;
}

当然,要把你的dll 放在和 sln同一个目录下。

(What‘s the sln? 简言之,就是你打开VS2010,选择   打开项目,然后你要选择的那个文件。)


生成解决方案,运行:

WIN7+VS2010 制作与调用DLL


可以哟~WIN7+VS2010 制作与调用DLL

.cpp文件下,有些东东还有些区别:

比如关于HMODULE,这个也可以是HINSTANCE和HWND:

可以看 -> http://blog.csdn.net/zhchongyao/article/details/6216659 。


当然,也可以在DLL中调用DLL:

方法一样(函数作用比较三个数大小):

#include <Windows.h>

typedef int ( __cdecl *findMax)( int a , int b );

extern "C" __declspec(dllexport) int __cdecl th_max( int a , int b ,int c )
{
	findMax fmax;
	HINSTANCE hLib;
	hLib = LoadLibrary(TEXT("max_2.dll"));
	fmax = ( findMax )GetProcAddress( hLib , "max" );

	return fmax( fmax( a,b ) , c );
}

但是,你若要调用这个dll,必须同时把这个DLL和max_2.dll 放在sln同一个目录下。

缺一不可哟~


WIN7+VS2010 制作与调用DLL恩,对于DLL制作和使用就是这样~WIN7+VS2010 制作与调用DLL

See  U~




***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

WIN7+VS2010 制作与调用DLL

上一篇:Node.js v0.10.31API手册-目录


下一篇:WinForm特效:拦截窗体上各个部位的点击