***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
嗯哼~之前帮老师做的那个模块,不用做了= =。
做了近十天,结果跑了13分钟
人家,秒级别的,甚至毫秒级的速度。。。。
哎。。。。
跪拜ING,2000+ X 2000+阶矩阵,有乘法,点乘,转置,求逆,一系列操作,
而且,乘法至少要进行40+次,求逆也要进行40+次,
这是如何进行秒级出结果的= =。。
或者,它们压根就没有通过矩阵来计算。
唉,不想了。
老师,是用C#做的,当时要我将这个函数模块 做成DLL,给他,告诉他参数和返回。
话说,我不会做DLL,表示羞愧ING
于是乎,各种搜索加测试,终于搞懂了。
对了,我的环境是 WIN7 + VS2010
1.生成DLL文件
恩,首先,打开VS2010新建一个WIN32项目,名称max_2(当然,你想叫啥就叫啥):
弹出对话框,点击-> 下一步
然后选择DLL,并点击空项目,然后选择完成:
然后,右键点击项目名称(右方),选择添加->新建项:
然后,找 .cpp 文件,输入文件名称,建立:
然后,填写你的代码,这里我就以 比较两个数大小为例:
在.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 ,
选择 生成 -> 配置管理器:
然后,在 活动解决方案配置,选择 Release:
点击关闭,然后生成解决方案。
然后,在生成的文件根目录下,找到Release文件夹,
打开就可以看到dll文件了:
OK,dll 文件生成成功!
2. 调用DLL
接下来,就是如何在VS下调用dll。
新建一个WIN32 控制台应用程序(取消选择建立解决方案):
然后,在弹出来的窗口中,点击下一步,然后选择 控制台应用程序,空项目:
同生成一样,新建一个.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,选择 打开项目,然后你要选择的那个文件。)
生成解决方案,运行:
可以哟~
.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同一个目录下。
缺一不可哟~
恩,对于DLL制作和使用就是这样~
See U~
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************