东升铮 发表于 2022-12-23 02:22

-ARX->ObjectARX的“公共厕所”

本帖最后由 东升铮 于 2022-12-23 17:05 编辑

前言:

         在发布了这篇文章以来的三十多个小时、我不断思考着:“是不是我写的太复杂了,陈述不到意思呢?”,心中种种思绪万千,在这样的夜里~辗转反侧起来又一通测试!!
为什么要这样做?为什么要支持C++14?也许很多人看了那篇文章都是处于一个懵逼的状态:“这叼毛写的什么帖子?真臭!看又看不懂...这叼毛想干嘛?。接下来我把想法过程重新整理一下。
      为什么这样做?有几个原因,其一就是如那篇文章所说的语言特性不支持。其二就是objectarx多版本文件太多且厚重,能不能把重复的二进制、第三方操作(如Sqlite)的函数全放一起?
不至于让这些二进制随地大小便?让调试维护加密等操作更方便一些呢?至于arx文件则充当一个中转站把去调用。像”公共厕所“这样的操作既做到节省空间又方便维护调试加密;
第一章的ARX导出acutPrintf函数的做法不得行、那样做的话是”私人厕所“只能他{导出的ARX}一人上厕所,这与我的”公共厕所“想法相悖论,今天我们推翻前面的做法,

利用”函数作为参数传递“(指针传递)搭一个既高级又美观的”公共厕所“。

不想按文一步步来、底部有Demo项目文件。

正文:

1.新建项目->空项目->项目名称:”DllDemo“(亦可自定义)。
2.属性->常规->改为动态库。
3.创建DllDemo.h和DllDemo.cpp。

安排人员上厕所-->在DllDemo搭一个参数为函数的函数(DllDemo.cpp):

#include <iostream>
using namespace std;
#include "DllDemo.h"


int DllDemo(int (*func)(const std::string String))//因为Achar是*CAD*的、这里我们用string类型。
{
      (*func)("\n小A要上厕所...");
      (*func)("\n小B要上厕所...");
      (*func)("\n小C要上厕所...");
      return 0;
}

把要上厕所的人员打包丢去厕所-->在DllDemo把这个函数导出(DllDemo.h):

#pragma once
#ifndef DLL_DEMO_H
#define DLL_DEMO_H

#ifndef _DLL_DEMO_
#define DLLDEMO _declspec(dllexport)//导出
#else
#define DLLDEMO _declspec(dllimport)//导入
#endif // !_DLL_DEMO_
DLLDEMO int DllDemo(int (*func)(const std::string String));
#endif // !DLL_DEMO_H


搭建厕所:
1.新建项目解决方案:名称为:”DemoC++“.(也可以在第二步创建时修改解决方案名称。)
2.新建Objectarx项目->项目默认->项目名称:”ArxDemo“(亦可自定义)。
3.解决的解决方案包含住上面建的DllDemo项目。
4.布置项目的CAD指向包含目录{Inc}跟库目录{Lib}。(这个不用教了吧?)
5.做了那么多只为了把所有程序最终输出至解决方案目录、好方便指向。
6.Inc添加"DllDemo"文件夹路径(以调用头文件)、Lib添加解决方案输出目录(以链接至DllDemo动态库文件)。
7.链接器->输入->附加依赖项->"DllDemo.lib"

acrxEntryPoint.cpp:
先调用DllDemo.h头文件:
#include "DllDemo.h"
因为过来的是string类型、这里我们要转换回来。
在class外建一个接收人员处理函数

//StringToAChar
ACHAR* StringToAChar(const std::string inString)
{
const char* orig = inString.c_str();
size_t origsize = strlen(orig) + 1;
size_t convertedChars = 0;

ACHAR* wcstring = (ACHAR*)malloc(origsize * 2 + 1);
mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
return wcstring;
}

在class外安排人员去转换。

intAcutPrintf(const std::string String)
{
return acutPrintf(StringToAChar(String));
}

最后在// TODO: Add your initialization code here处调用DllDemo()函数把要上厕所人员推进去。
DllDemo(AcutPrintf);
Demo项目文件: 可能名字重复、DemoC++并没有完全显示,就这样吧

注意:要在搜索路径加入程序目录不然CAD会找不到。
效果:
                  

如果觉得帖子对你有帮助的话,麻烦给平头仔一个免费的评分!谢谢!
好了好了、我要休息了,昨天村里老人过世然后到处跑,今天不知道是不是没休息够还是怎么的,好不舒服,疫情当下,我倒是不怕,就怕我女儿,希望不要羊了呀;
最后祝福明经的朋友身体健康,工作顺利。

baitang36 发表于 2022-12-23 08:20

好帖,学习中

qq1254582201 发表于 2022-12-27 14:34

好东西,留爪,后期来摩拜一下
页: [1]
查看完整版本: -ARX->ObjectARX的“公共厕所”