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

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

相关文章

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工程
  • 新建VS C++ console工程,
  • 总结


新建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 
#include 
#include 

int main()
{

	HINSTANCE handle = LoadLibrary(_T("SimpleDemo.dll"));//LoadLibrary ddl ,需要引入 加上_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可以查看输出结果


总结

这个系列演示用到的源码

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1330772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存