明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 819|回复: 2

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

  [复制链接]
发表于 2022-12-23 02:22 | 显示全部楼层 |阅读模式
本帖最后由 东升铮 于 2022-12-23 17:05 编辑

前言:

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


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

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


正文:

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


安排人员上厕所-->在DllDemo搭一个参数为函数的函数(DllDemo.cpp):
  1. #include <iostream>
  2. using namespace std;
  3. #include "DllDemo.h"


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

把要上厕所的人员打包丢去厕所-->在DllDemo把这个函数导出(DllDemo.h):
  1. #pragma once
  2. #ifndef DLL_DEMO_H
  3. #define DLL_DEMO_H

  4. #ifndef _DLL_DEMO_
  5. #define DLLDEMO _declspec(dllexport)//导出
  6. #else
  7. #define DLLDEMO _declspec(dllimport)//导入
  8. #endif // !_DLL_DEMO_
  9. DLLDEMO int DllDemo(int (*func)(const std::string String));
  10. #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头文件:

  1. #include "DllDemo.h"

因为过来的是string类型、这里我们要转换回来。
在class外建一个接收人员处理函数

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

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

在class外安排人员去转换。
  1. int  AcutPrintf(const std::string String)
  2. {
  3.   return acutPrintf(StringToAChar(String));
  4. }

最后在// TODO: Add your initialization code here处调用DllDemo()函数把要上厕所人员推进去。
  1. DllDemo(AcutPrintf);

Demo项目文件: 可能名字重复、DemoC++并没有完全显示,就这样吧

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +3 金钱 +50 收起 理由
p-3-ianlcc + 1
革天明 + 1 + 50 很给力!
caoliu023 + 1 很给力!

查看全部评分

发表于 2022-12-23 08:20 | 显示全部楼层
好帖,学习中
发表于 2022-12-27 14:34 来自手机 | 显示全部楼层
好东西,留爪,后期来摩拜一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 10:42 , Processed in 0.492372 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表