CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用

CANoe DLL 编程 专栏收录该内容
6 篇文章 7 订阅

相关文章

2

CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
CANoe DLL编程(二)—— 创建CANoe适用的DLL以及调用
CANoe DLL编程(三)——DLL和回调函数
CANoe DLL编程(四)——SendKey DLL的CANoe应用
CANoe DLL编程(五)——通过VS 生成 SendKey.dll
CANoe DLL编程(六)—— DLL 的二次封装


前言

  • DLL文件在CANoe编程中用途广泛,熟练的掌握DLL编程可以弥补CAPL脚本被阉割后的无力感;将common代码封装成DLL,可以减少冗余代码;而且诊断中的seedkey也是必不可少的。

  • 本节博客是系列博客的第一节,简单讲述怎么用VS生成DLL以及调用方法,本章内容在全网有很多,之所以在这里重新开篇是因为,VS生成的DLL是不能直接在CANoe中使用的,CANoe有自己的规则,可以增加对比和理解.

  • 软件环境:
    win10 x64
    visual studio 2019
    CANoe 11 x64

请添加图片描述

请添加图片描述


新建VS DLL工程

① 根据下图可以创建一个 DLL工程

在这里插入图片描述

在这里插入图片描述

② 下图是创建的工程,我没添加一行代码,点击了Build Solution之后就生成了D:\CANoeDLL\MyCANoeDLL\Debug\SimpleDemo.dll

在这里插入图片描述
③ 就简单增加一个函数my_add ,然后新建一个simple.h文件,增加代码如下图
对 extern “C” __declspec有疑问点击这里


#ifndef SIMPLE_H
#define SIMPLE_H

#if _MSC_VER > 1000 
#pragma once
#endif

// C++ 常规编译写法
#ifdef MYDLL_EXPORTS
#define MYDLL extern "C" __declspec(dllexport)
#else
#define MYDLL __declspec(dllimport)
#endif


//声明自定义函数
MYDLL int my_add(int a, int b);


#endif 

在这里插入图片描述
④ 在dllmain.cpp中增加代码如下,然后点击Build Solution重新生成即可

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#define MYDLL_EXPORTS
#include "simple.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

MYDLL int my_add(int a, int b)
{
    return (a + b);
}

在这里插入图片描述

  • 如果编译报错 Cannot open precompiled header file: 'Debug/****.pch' 可以不要使用编译头文件,如下图设置。

在这里插入图片描述


美图欣赏

在这里插入图片描述


新建VS C++ console工程,

① 下面我们新建一个C++ 控制台工程演示下DLL的调用

在这里插入图片描述
②,将上面生成的SimpleDemo.dllcopy到新建的CallDllTest目录下
在这里插入图片描述
③,CallDllTest.cpp 代码如下图

// CallDllTest.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <Windows.h>
#include <tchar.h>

int main()
{

	HINSTANCE handle = LoadLibrary(_T("SimpleDemo.dll"));//LoadLibrary ddl ,需要引入<tchar.h> 加上_T,不然编译报错
	std::cout << "dll的句柄返回值:"<< handle <<"\n";//打印dll的句柄地址值,不为0就说明调用成功
	if (handle)
	{
		typedef int(*DLL_FUNCTION_ADD) (int, int); //typedef定义一下函数指针,(int, int) 是要调用dll中的函数参数类型
		DLL_FUNCTION_ADD dll_add = (DLL_FUNCTION_ADD)GetProcAddress(handle, "my_add"); //使用GetProcAddress得到dll中的函数,重命名为 dll_add
		std::cout << "dll 函数的句柄返回值:" << handle << "\n";//打印dll的函数句柄地址值,不为0就说明调用成功
		if (dll_add)
		{
			int result = dll_add(10, 11); //终于可以用add了
			std::cout << "dll_add结算结果:" << result << "\n";
			FreeLibrary(handle); //卸载句柄,,
		}
	}
    std::cout << "Hello World!\n";
	return 0;
}

// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu

④, Ctrl + F5 或者 点击Start Without Debugging可以查看输出结果
在这里插入图片描述


在这里插入图片描述

总结

这个系列演示用到的源码

7

在这里插入图片描述

  • 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
  • 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18
  • 2
    点赞
  • 0
    评论
  • 8
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

蚂蚁小兵

赏博主个鸡腿!

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值