VS2010 C语言DLL项目hello world程序以及win32控制台程序调用dll示例

news2024/11/25 7:08:58

一、使用Visual Studio 2010编写C语言 DLL项目hello world程序

1.点击桌面 VS2010 图标,运行程序。(或者通过菜单栏打开程序) 

2.点击【文件】 -> 【新建】 -> 【项目】

3.点击【VisualC++】和【win32控制台应用程序】,设置好名称和存储位置,点击【确定】

 4.点击【下一步】

5.选择【DLL】和【空项目】,点击【完成】

6.至此就完成了控制台项目的新建,在VS2010程序界面的右侧可以看见新建好的控制台项目

7.在项目名下方的【源代码】(或【头文件】)文件名上点击鼠标右键,在弹出菜单栏上点击【添加】-> 【新建项】(或【现有项】,现有项是已经存在的源代码文件)

8.点击【代码】 -> C++文件(.cpp)(或【头文件(.h)),输入新文件的名称(如:demoDll),点击【添加】

9.此时在VS2010程序界面右侧就可以看到源文件,点击源文件就可以开始输入代码了

10.在源文件中(如:demoDll.cpp)输入下述代码,确定正确无误之后继续往下

#include "demoDll.h"

int add(int a, int b) {
    return a + b;
}

11.在项目名下方的【头文件】文件名上点击鼠标右键,在弹出菜单栏上点击【添加】-> 【新建项】(或【现有项】,现有项是已经存在的源代码文件)

12.点击【代码】 -> 【头文件(.h),输入新文件的名称(如:demoDll),点击【添加】

13.在源文件中(如:demoDll.h)输入下述代码,确定正确无误之后继续往下

#pragma once

// extern "C" 是表示C语言代码,优点通常调用动态库不改变函数名
// _declspec(dllexport) 导出函数
extern "C" __declspec(dllexport) int add(int a, int b);

14.根据应用场景进行平台设置

x86(Win32)、x64的区别:

x86(Win32)平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的;x64对应的则是64位的。

若你的启动项目,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集...或它的某一个依赖性。试图加载格式不正确的程序。”之类的错误。这是因为32位程序不能加载64位的dll,更不能调用其中的类、方法和对象等。反之,若主程序是由x64平台编译出来的,而dll是x86的呢?答案。。也是不行的!

15.点击【生成】 -> 【重新生成解决方案】(或快捷键Ctrl + Alt + F7),直至没有报错为止 

在输出文件夹(Debug或Release)下可以找到新生成的demoDll.dll和demoDll.lib。

如何使用DLL工程生成的文件,参见下一节内容。

二、win32调用dll示例

1.参照文章【2022 VS2010 C语言控制台输出 Hello World VS2022 和 VS2010 C语言控制台输出 Hello World_vs控制台输出_西晋的no1的博客-CSDN博客 】,建立一个win32控制台程序。

2.将上述DLL项目生成的demoDll.dll文件放到win32控制台程序的源文件下,位置如下图所示。

3.win32控制台程序的demo.cpp文件内容,用下述代码覆盖

#include <stdio.h>
#include<Windows.h>
int main()
{
    HMODULE h = NULL;//创建一个句柄h
    h = LoadLibrary(L"demoDll.dll");
    if (h == NULL)//检测是否加载dll成功
    {
        printf("加载DLLTest1.dll动态库失败\n");
        return -1;
    }


    typedef int(*AddFunc)(int, int); // 定义函数指针类型
    AddFunc add;
    // 导出函数地址
    add = (AddFunc)GetProcAddress(h, "add");


    int sum = add(100, 200);
    printf("动态调用的结果%d\n", sum);

    return 0;
}

4.点击【生成】 -> 【重新生成解决方案】(或快捷键Ctrl + Alt + F7),确定正确无误之后继续往下

5.运行程序

代码输入完成以后,可以通过以下2种方法来运行。

1、在菜单栏上选择“调试”-“开始执行(不调试)”命令。

2、编译环境中使用快捷键Ctrl+F5直接开始执行。

6.运行结果

三、资源下载链接

https://download.csdn.net/download/xijinno1/87862021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

白盒测试方法

为什么要进行白盒测试&#xff1f; 如果所有软件错误的根源都可以追溯到某个唯一原因&#xff0c;那么问题就简单了。然而&#xff0c;事实上一个bug 常常是由多个因素共同导致的&#xff0c;如下图所示。 黑盒查不到的问题 假设此时开发工作已结束&#xff0c;程序送交到测试…

飞腾FT2000实战开发-GPIO的配置

目录 环境&#xff1a; 飞腾GPIO介绍&#xff1a; 临时配置&#xff1a; 永久配置&#xff1a; 环境&#xff1a; CPU:FT2000&#xff08;64位&#xff0c;四核&#xff09; 操作系统&#xff1a;linux-4.4.131-20200710 内核&#xff1a;kylin4.0.2 飞腾GPIO介绍&#x…

JavaScript创建二维数组踩坑记录

需求&#xff1a;创建一个m*n且元素值为0的二维数组 碎碎念 1、 今天刷Leetcode时&#xff0c;遇见一个这样的需求&#xff0c;机智如我&#xff0c;定然不会通过双重for循环来创建&#xff0c;于是&#xff0c;我写了这样一行代码 const dimensionalArray new Array(m).fi…

Spring Boot 加载自定义配置文件

文章目录 一、为什么需要加载自定义配置文件二、使用PropertySource加载自定义配置文件&#xff08;一&#xff09;创建Spring Boot项目&#xff08;二&#xff09;创建自定义配置文件&#xff08;三&#xff09;创建自定义配置类&#xff08;四&#xff09;编写测试方法&#…

硅谷甄选 Blog_01-搭建后台管理系统模板

搭建后台管理系统模板分为两大步骤&#xff1a; 项目初始化项目配置 项目初始化 环境准备 node&#xff1a;v16.16.0pnpm&#xff1a;v7.22.0 初始化项目 全局安装pnpm指令&#xff1a; npm i -g pnpm项目初始化指令&#xff1a; pnpm create vite如下图所示进行项目的…

嵌入式BSP工程师基本任务分析

到底什么是BSP工程师呢&#xff1f;来看这篇文章吧 一、嵌入式系统 要明白什么是嵌入式软件工程师&#xff0c;我们先从嵌入式系统&#xff08;嵌入式设备&#xff09;说起。维基百科上对嵌入式系统的定义如下&#xff1a; 嵌入式系统&#xff08;Embedded System&#xff0…

5 个强大的 HTML5 API

HTML5提供了一些非常强大的JavaScript和HTML API&#xff0c;来帮助开发者构建精彩的桌面和移动应用程序。本文将介绍5个新型的API&#xff0c;希望对你的开发工作有所帮助。 1. 全屏API&#xff08;Fullscreen API&#xff09; 该API允许开发者以编程方式将Web应用程序全屏运…

1_标准IO

目录 标准I/O一、概念二、特点⭐⭐⭐三、缓冲区⭐⭐⭐3.1 全缓冲3.1 行缓冲3.3 不缓冲 四、函数接口⭐⭐⭐⭐4.1 打开4.1.1 fopen4.1.2 freopen4.1.2 容错机制perror 4.2 关闭4.2.1 fclose4.3 读写操作4.3.1 字符I/O4.3.2 行I/O4.3.3 块I/O 4.4 定位操作4.5 文件结束和错误 标准…

多维时序 | MATLAB实现NARX非线性自回归外生模型多变量多步时间序列预测(电池预测模型)

多维时序 | MATLAB实现NARX非线性自回归外生模型多变量多步时间序列预测(电池预测模型) 目录 多维时序 | MATLAB实现NARX非线性自回归外生模型多变量多步时间序列预测(电池预测模型)效果一览基本介绍模型描述程序设计参考资料效果一览 基本介绍 多维时序 | MATLAB实现NARX非…

CSDN 周赛 56 期

CSDN 周赛 56 期 1、题目名称&#xff1a;因数-数字游戏骗分抛出异常考试时代码 2、题目名称&#xff1a;津津的储蓄计划3、题目名称&#xff1a;一维数组的最大子数组和4、题目名称&#xff1a;莫名其妙的键盘小结 1、题目名称&#xff1a;因数-数字游戏 小Q的柠檬汁做完了。 …

为视图增加权重以调整基本线性布局

乍看上去线性布局LinearLayout很基础&#xff0c;不太灵活&#xff0c;毕竟其只是按照某种顺序摆放视图。但是还可以使用另外一些属性调整布局的外观。 编写一个不太一样的布局。这个布局让按钮显示在布局的右下角&#xff0c;其余全部空间由一个可编辑文本域占据。 一个基本线…

算法套路十九——树形DP

算法套路十九——树形DP 树形 DP&#xff0c;即在树上进行的 DP。由于树固有的递归性质&#xff0c;这里的DP是指是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法&#xff0c;故虽然带有DP&#xff0c;但一般都是通过递归来进行。 算法示例一&#xff1a;…

centos7使用docker compose部署ELK

说明&#xff1a;1、一定要先不要配置那么多配置文件&#xff0c;去除掉一些&#xff0c;先让docker compose启动相关服务能访问的时候&#xff0c;使用拷贝方法&#xff0c;把相关的配置文件拷贝出来在外面修改&#xff0c;这样保险一些&#xff0c;不然容易配置文件错误无法启…

90.构建 “工作流程 “第一部分

记得我们上次实现的页面的了么&#xff0c;如下图所示&#xff0c;这节我们接着来 记住我们之前的画的草图 现在我们就来构建Z字形的工作流程部分&#xff1b; ● 首先我们添加标题 工作流程 3个简单的步骤制作您每天的健康饮食 ● 接着就是添加Z字形的工作步骤 <div cl…

Visual Studio Code 下载安装教程(含必备插件)

文章目录 下载安装插件列表 下载 点击进入 VSCode 官网&#xff1a;https://code.visualstudio.com/&#xff0c;并点击右侧箭头&#xff0c;选择对应的版本&#xff0c;点击下载&#xff08;以Windows 版本为例&#xff09;&#xff1a; 等待下载完成&#xff1a; 安装 双击…

01人工智能导论概念总结

文章目录 第一章第六章第八章 第一章 人工智能&#xff1a;又称为机器智能&#xff08;Machine Intelligence&#xff0c;MI&#xff09;&#xff0c;主要研究用人工的方法和技术开发智能机器或智能系统&#xff0c;以模仿、延伸和扩展人类智能、生物智能、自然智能&#xff0…

Jenkins+RF持续集成测试(一) 环境搭建

通常在自动化测试中&#xff0c;我们需要对自动化测试用例定时构建&#xff0c;并生成报告并通过邮件发给指定的人。最佳工具选择莫过于Jenkins了。通过Jenkins集成robot framework插件&#xff0c;我们能非常方便的定时从git/svn上拉取最新的自动化测试用例&#xff0c;然后执…

MyBatis 学习笔记

MyBatis学习笔记 1、简介1.1、什么是MyBatis1.2、持久化1.3、持久层1.4、为什么需要MyBatis 2、MyBatis第一个程序2.1、搭建环境2.2、创建一个模块2.3、编写代码2.4、编写测试类 3、CRUD3.1、namespace3.2、select3.3、insert3.4、update3.5、delete3.6、分析错误3.7、万能Map3…

【内存操作函数】字符串函数不敢干的事,我干!

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 内存操作函数 1. 前言&#x1f6a9…

操作系统复习2.4.0-死锁详解

什么是死锁 各进程互相竞争对手里的资源&#xff0c;导致各进程都阻塞&#xff0c;都无法向前推进 死锁、饥饿、死循环的区别 死锁&#xff1a;各进程互相持有对方想要的资源且不释放&#xff0c;导致各进程阻塞&#xff0c;无法向前推进 饥饿&#xff1a;由于长期得不到想要…