WIN7+VS2010 制作与调用DLL

***************************************转载请注明出处: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********************************************

时间: 2024-10-31 06:29:28

WIN7+VS2010 制作与调用DLL的相关文章

利用vs2010制作C语言 dll文件,并在其它程序中调用该dll文件

一.为什么需要dll 代码复用是提高软件开发 效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架, 如ATL.MFC等,它们都以源代码的形式发布.由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”.“白盒复用”的缺点 比较多,总结起来有4点. 暴露了源代码: 容易与程序员的“普通”代码发生命名冲突: 多份拷贝,造成存储浪费: 更新功能模块比较困难. 实际上,以上4点概括起来就是

VS2010制作dll

一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,如ATL.MFC等,它们都以源代码的形式发布.由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”.“白盒复用”的缺点比较多,总结起来有4点. 暴露了源代码: 容易与程序员的“普通”代码发生命名冲突: 多份拷贝,造成存储浪费: 更新功能模块比较困难. 实际上,以上4点概括起来就是“暴露

MFC动态调用dll到指定的进程中(win7系统vs2013环境下)

一.主程序 1.新建一个MFC项目,类型选择基于对话框 2.写一个简单的窗体 点击启动事件 MessageBox(L"调用Dll到程序中成功."); 二.要调用的Dll 1.新建一个win32dll 选择dll.勾选导出符号 1.生成Dll项目 此时会在主程序Main的debug文件夹中生成了Dll.dll和Dll.lib文件 三.配置主程序Main的属性 1.选择链接器--输入--附加依赖项:Dll.lib 1.选择连接器--输入--常规--附加库目录:..\Debug 1.包含头文

Java 调用 C++ (Java 调用 dll)康哥手把手教你

因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是研究了一下Java Jni的使用方法.突然发现Android Jni 使用跟这个好像(麻蛋,不就是一样的吗,但是Android中需要使用so动态链接库). 第一步 创建Java工程,命名JniDemo,添加JniDemo.java 第二步 在Java类中添加native方法 /** * @author Baokang */ public class JniDemo{ public native static void se

VS2010 C++环境下DLL和LIB文件的生成与调试

利用VS2010工具,调试DLL文件的方法现总结如下: 在一个解决方案中生成两个工程,假设MYDLL和MYDLG两个工程,前者是DLL工程,后者DLG调用前边的DLL工程.设置如下: 目录如下:图,本文例子中,DLL文件和EXE文件都生成在下边的这个DEBUG文件中:D:\My Documents\Visual Studio 2010\Projects\MYDLL\Debug,当然,也可以生成在其他文件目录下,只要设置正确即可.     目的:遵循DLL和exe最后生成的文件在一个目录内,且两个

Win7+vs2010下安装boost_1_46_1库

一.boost库分类: (1)不需要编译库:any.array.asio.conversion.crc.bind/mem_fn.enable_if.function.lambda.mpl.smart_ptr... (2)需要编译的库:date_time.filesystem.function_types.graph.iostreams.math.mpi.program_options.python.regex.serialization.signals.system.test.thread.wa

VS2010 C++环境下DLL和LIB文件目录及名称修改

DLL工程,Debug版本下输出文件由basetool.dll basetool.lib 改为basetoolD.dll basetoold.lib 需设置: 1.配置属性-常规-目标文件名 $(ProjectName) 加d 2.配置属性-连接器-常规-输出问件 由 加d 3.配置属性-连接器-高级-导入库,设置文件名$(OutDir)$ProjectName)d.lib 4.如果有导出文件,.def文件中也一定要修改导出库的名字 LIBRARY      "BaseTool" 变为

[转]windows下VS2010中lib与dll文件的生成与使用

原文地址:https://my.oschina.net/SysuHuyh5LoveHqq/blog/644622 近期在windows下开发了某个程序,需要将其生成静态文件(lib)以及动态库文件(dll),其中参考了不少帖子,有的讲得也不是很清楚明白,先将本人实践过的记录一下,供后期自己查询,也供各位大牛点评. 一.lib文件的生成与使用 1.lib的生成 相对来说,静态库文件还是比较容易生成和使用的,在代码上,貌似也不需要更改什么,举例说明: 头文件函数声明形式如下: extern bool

MFC之调用DLL的问题:error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR

今天在项目中遇到了一个小小的问题,在调用别人动态连接库(DLL)的时候,总是出现如下提示,导致程序无法正常运行,编程环境:VS2010+MFC 问题提示:error C2664: "LoadLibraryW": 不能将参数 1 从"const char *"转换为"LPCWSTR 经过查找资料,问题得以解决,感谢: 解决方法来源于:http://blog.sina.com.cn/s/blog_6a2236590100xbgl.html 1 静态调用Lib