当前位置: 代码迷 >> 综合 >> CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
  详细解决方案

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

热度:58   发布时间:2023-09-20 13:16:26.0

? 相关文章

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

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

文章目录

  • ? 相关文章
  • ?前言
  • 新建VS DLL工程
  • 新建VS C++ console工程,动态引用DLL
  • ?总结

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

新建VS DLL工程

1?? 根据下图可以创建一个 DLL Demo工程,

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


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


2?? 下图是上面创建的工程自带的默认代码, 咱先不动,直接点击Build Solution,这样就生成了一个DLL文件,这样我们就简单掌握了用VS创建DLL工程和如何生成DLL文件

  • DLL文件路径:D:\CANoeDLL\MyCANoeDLL\Debug\SimpleDemo.dll

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


3?? 我们就在dllmain.cpp中增加一个函数my_add ,用来进一步熟悉vs 生成Dll的过程

// 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);
}

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


4?? 然后新建一个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 

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


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

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


美图欣赏

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


新建VS C++ console工程,动态引用DLL

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

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


2?? 将上面生成的SimpleDemo.dllcopy到新建的CallDllTest目录下

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


3?? 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_addstd::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

4?? Ctrl + F5 或者 点击Start Without Debugging可以查看输出结果

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

End

?总结

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

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

? 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用

  • ?要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • ? 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有网盘资料源码,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。

  • ?如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
  相关解决方案