首页 - 信息 - vs2010生成32位程序_如何使用VS2010生成win32和win64动态库(详细图文说明)

vs2010生成32位程序_如何使用VS2010生成win32和win64动态库(详细图文说明)

2023-10-04 09:29

本来mfc已经是一个很落后的东西了。现在所有表单都是用 C# 编写的。说到 vs windows 其实大家都会想到c#。即便如此,我本来就了解了Windows Forms的编程机制,同时也秉承了这样的理念:用VC6能实现的东西,用VS就能实现,而且更高级。同时,市面上大部分介绍Win32 Forms C++编程的书籍都是基于VC6版本的,所以需要在VS中逆向实现win32 form程序。

具体这样做:

1、打开VS2010,创建一个win32窗体程序,如下图。

2.点击Next,直接使用默认设置点击Finish,创建Windows应用程序

3.可以直接编译运行,但是生成的内容不让我们满意。如下图所示,有一个我们不需要出现的菜单栏。我们还想在表单中输出一个Helloworld。

也许此时此刻,你觉得VC6没有那么乱,或者说你觉得VC6和VS2010有很大的区别?有的书上显示,创建项目时选择第3项,编译运行一劳永逸?

但事实上VC6中不一样。而且你还可以发现,VC6文件实际上与这里的VS2010文件类似。

其实VS2010只是放了一些兼容文件在上面而已。一遍又一遍还是同样的事情,画一个表单,然后这个表单中有一个函数不断循环,就是为了读取鼠标或者键盘的响应信息。然后所有这些信息都被扔到消息回调函数LRESULT CALLBACK WndProc中。只要在这个函数中写下你想要做的任何事情就可以了。

只是一个框架,没有什么技术含量,你只要改一下Java web什么的,把win32形式特有的程序框架里的东西改一下,在里面添加你自己的东西就可以了。

好了,说了这么多,那我们如何才能实现摆脱菜单栏,输出Helloworld文件的梦想呢?

4、直接从主cpp Win_Helloworld.cpp开始(文件名会根据第一步中的工程名而有所不同)并进行修改。

(1)去掉菜单栏,从ATOM MyRegisterClass(HINSTANCE hInstance)函数开始,整个程序第87行,修改如下,将其值替换为NULL。

另外注释或删除第142-158行消息回调函数中关于菜单栏单机处理的case WM_COMMAND事件。

第 172-190 行是关于“关于”对话框功能的较长部分。

(2) 输出Helloworld

接下来我们需要从消息回调函数中的案例WM_PAINT开始:这个所谓的“重绘事件”是指每次移动或最大化窗口时,都会触发该事件,从而重绘窗体。惠,vs2010也很厚道。您应该从这里开始您的 win32 表单程序之旅。修改case WM_PAINT:如下图。其实只是增加了两个函数,SetTextColor和TextOut:

案例WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO:在此处添加任何绘图代码...

SetTextColor(hdc,RGB(0,0,0));//黑色笔刷

TextOut(hdc,100,100,L"Helloworld",strlen("Helloworld"));//在文件(100,100)中,输出Helloworld。

EndPaint(hWnd, &ps);

断裂;即:

你可以把这个hdc理解为在这个表格上画东西的画笔。然后,每个功能基本上都是名副其实的。值得提醒的是,在TextOut函数中,与VC6不同,在VS2010中,所有那些LPCTSTR都不能直接放入字符串中,必须在前面添加一个大写的L来强制转换。将普通字符串转换为系统中的表单字符(大致就是这个意思)。所以你知道C++中的各种变量是多么烦人,也知道PHP等无变量类型的设计是多么伟大。

写到这里就写完了。运行结果如下图:

最后来个小结局吧。

在用C++编写Win32形式的程序时,不要套用C语言中从0开始的思想。说明系统给了你一个框架,你可以根据它的要求进行修改。

当你开始时,你不需要熟悉这个框架。从这个框架的一些基础的东西入手,实现一些最基本的功能。

程序员出来工作基本都是这样。很少有人要求你从头开始学习一门语言。基本上,您在框架内修补和创建。

或者在了解Win32窗体程序和Win32最基本的WIN API的同时,可以提高你面对框架的能力。

内容摘要

〇、背景 1、生成win32动态库 1.1 生成动态库的一般方法 1.2 生成动态库的模块定义文件方法

2. Win32动态库测试 3. 生成可以在Java中运行的动态库

〇、背景

??最近,我在整理一位陪伴了我近10年、即将离开我的老朋友的资料(笔记本电脑)时,发现在一个名为“学习资料”的不起眼的文件中,有过这样的一份文件,看着过去的努力总结,心想自己也一步步从一个坑爬到了另一个坑,总结并不容易。我想了想,就把它发表出来,给当时和我有类似经历的人。有需要帮助的朋友可以尽其所能。

1。生成win32动态库

1.1 生成动态库的一般方法

??1。打开VS2010,新建一个项目,选择如图1.1所示。

图1.1操作图

??2.单击“确定”,然后直接选择“下一步”。如下图1.2所示。

图1.2操作图

??3。选择“dll”,选择“空项目”,然后“完成”。如下图1.3所示。

图1.3操作图

??4。右键单击项目 --> 添加 --> 新项目。如下图1.4所示。

图1.4操作图

??5。选择“C++”,输入文件名加后缀,(如图中的maindll.c),找到需要的放置路径,点击“添加”。如下图1.5所示。

图1.5操作图

??6。然后在maindll.c中输入下载的代码:

#包括

#包括

#包括

__declspec(dllexport)

int add(int a, int b)

{

printf("输入数据 a = %d, b = %d\r\n", a, b);

printf("a + b = %d\r\n", a + b);

返回 a + b;

}

__declspec(dllexport)

int sub(int a, int b)

{

printf("输入数据 a = %d, b = %d\r\n", a, b);

printf("a - b = %d\r\n", a - b);

返回 a - b;

}

??7。然后右键-->新建-->添加新项-->maindll.h,输入以下代码:

#pragma Once

#ifndef __MYDLL_H__

#define __MYDLL_H__

#包括

#ifdef __cplusplus

外部“C”{

#endif

#if BUILDING_DLL

#define DLLEXPORT __declspec(dllexport)

#else

#define DLLEXPORT __declspec(dllimport)

#endif

int add(int a,int b);

int sub(int a,int b);

#ifdef __cplusplus

}

#endif

#endif

??8,然后点击绿色小三角直接生成。如下图1.6所示。

图1.6操作图

??9。忽略这里报的错误,确认一下即可。如下图1.7所示。

图1.7操作图

??10。完全的。

??新生成的maindll.dll在目录:~\dll\Debug\:dll.dll,dll.lib

1.2 模块定义文件方法生成动态库

??1。首先在VS2010中用C语言新建一个空项目。操作如下图1.8所示。

图1.8操作图

??2.工程创建完成后,安装上面的方法添加C语言源文件和头文件,然后在maindll.c中输入代码:

#包括

#包括

#包括

int add(int a, int b)

{

printf("输入数据 a = %d, b = %d\r\n", a, b);

printf("a + b = %d\r\n", a + b);

返回 a + b;

}

int sub(int a, int b)

{

printf("输入数据 a = %d, b = %d\r\n", a, b);

printf("a - b = %d\r\n", a - b);

返回 a - b;

}

??然后在maindll.h中输入下载的代码:

#ifndef __MYDLL_H__

#define __MYDLL_H__

#包括

int add(int a,int b);

int sub(int a,int b);

#endif

??3。此时整个项目就是一个普通的应用生成项目。我们按照上面的方法继续添加一个“模块定义文件”文件。操作流程如下图1.9所示。

图1.9操作图

??然后在sources.def中输入代码:

图书馆

出口

#动态库中要导出的函数名称

添加

??4。然后我们继续修改项目属性,生成动态库文件而不是可执行程序。操作流程如下图1.10所示。

图1.10操作图

??5。至此,工程搭建和配置已经完成,我们直接生成动态库了。操作流程如下图1.11所示。

图1.10操作图

2。 Win32动态库测试

??1。打开一个新的VS2010测试程序来创建dll。如下图2.1所示。

图2.1操作图

??2.选择如下图2.2所示。

图2.2操作图

??3。右键-->添加-->创建一个新项目,命名,选择路径,然后添加。如下图2.3所示。

图2.3操作图

??4。将以下代码添加到文件中。

#包括

#include "stdio.h"

int main()

{

int a = 10, b = 30;

int c = 0, d= 0;

c = 添加(a, b);

d = sub(b, a);

printf("c = %d, d = %d\r\n", c, d);

系统(“暂停”);

}

??5。右键单击 --> 添加 --> 现有项目。如下图2.4所示。

图2.4操作图

??6。在找到之前dll的项目目录中找到maindll.h文件并添加。并在 test.c 前面包含以下头文件。

#include "maindll.h"

??7。从dll工程文件夹中找到这两个文件和头文件,复制到本工程和test.c同级目录下。如下图2.5所示。

图2.5操作图

??8。右键单击--> 属性。如下图2.6所示。

图2.6操作图

??9。然后复制xxx.lib的所有文件名,添加到这个地方,如下图2.7和2.8所示。

图2.7操作图

图2.8操作图

??然后OK,申请,OK。

??10。运行测试程序。如下图2.9所示。

图2.9操作图

??然后,就可以完美运行了。

??11。而且在调试运行过程中,用F11单步运行时,可以同步调试dll文件,非常方便。如下图2.10所示。

图2.10操作图

??12。调试完成后,可以转换为release版本,以后直接使用。

3。生成java等可以运行的动态库

1。打开 eclispe 并导入一个项目。如下图3.1所示。

图3.1操作图

图2.3操作图

??图中源码如下。

包 com.kerui.utils;

导入com.sun.jna.Library;

导入com.sun.jna.Native;

公共课DLLTest

{

公共接口Dll扩展库

{

Dll 实例 = (Dll)Native.loadLibrary("maindll", Dll.class);

public int add(int a, int b);

public int subtract(int a, int b);

public void printHello();

}

public static void main(String[] args)

{

System.out.println("哈哈");

int sum = Dll.instance.add(5, 3);

System.out.println("add(5, 3) = " + sum);

}

}

??然后直接运行即可。如果能够成功运行,那么恭喜你成功了。

??运行的话会报如下图3.2所示的错误。

图3.2操作图

??说明动态库生成还是有问题。

??可以按照下图3.3~3.6所示的方法进行修改。

图3.3操作图

图3.4操作图

图3.5操作图

图3.6操作图

??最后导入新编译的动态库,运行界面如下图3.7所示。

图3.7操作图

??测试完成后可以直接生成release版本直接使用。

??好吧,废话够多了,总结写起来并不容易。如果您喜欢这篇文章或者对您有用,请用您的一点小小的财富帮忙点个赞。当然,跟着它,还会有更多。好了,就这样吧(* ̄3)(ε ̄*)。

1.x86,即在普通PC上运行的程序版本。无需修改项目属性

?

2.x64

1.搭建项目平台——项目目录下会生成?x64文件夹

在工具栏中--->生成--->配置管理器窗口

  将“活动解决方案平台”和“平台”设置为x64。如果“平台”中没有x64,则单击新建。

2. 选择目标机器平台

在工具栏--->项目--->xx属性窗口中

  选择“配置属性”--->“链接器”--->“高级”--->“目标计算机”--->“machinex64”

?

?

3.Dll依赖问题

1.取消对clr的依赖? ??

  选择“配置属性”--->“c/c++”--->“公共语言运行时支持”?设置为“无”

2.设置mfc库连接方式

  “配置属性”--->“常规”--->“mfc 用法”

   设置为? “使用标准Windows库”?或“在静态库中使用mfc”

3. 设置代码生成运行时

  “配置属性”--->“c/c++”--->“代码生成”

  将“运行时库”设置为“多线程/mt”

?

?

附上csdn论坛版主的留言:

1. 确保您使用的是 32 位编译器 2. 确保不要使用 /clr 选项:这将取决于 .net 3. 确保使用 /mt 静态链接 crt。编译出来的程序自然可以到处运行。

?

4. 可能发生的情况

1、x64下的工程平台与机器目标平台不一致,报错

  致命错误lnk1112:模块计算机类型“x86”与目标计算机类型“x64”冲突 - 我的解决方案

?

5.备注

1.活动解决平台,这个与目标程序的运行无关,应该不需要设置。

   验证“活动解决方案平台”是否为 x64,并且项目平台设置为“win32”。它仍然可以在 x86 xp 下运行。生成的程序的目录是release下的,不是x64/release

2. 如果项目平台发生变化,目标平台也会发生变化

  验证“目标计算机”设置是否为“machinex64”。将项目平台切换到win32时,检查“目标计算机”设置是否已更改为“machinex86”

3、x86运行x64编译的程序时,错误信息如下: