CANoe DLL编程—— Visual Studio 创建DLL以及动态调用
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CANoe DLL编程—— Visual Studio 创建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.dll
copy到新建的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
可以查看输出结果
总结
- 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
以上是关于CANoe DLL编程—— Visual Studio 创建DLL以及动态调用的主要内容,如果未能解决你的问题,请参考以下文章
CANoe DLL编程—— 创建CANoe适用的DLL以及调用
CANoe DLL编程——通过VS 生成 SendKey.dll