objectARX ACED_ARXCOMMAND_ENTRY_AUTO

这篇具有很好参考价值的文章主要介绍了objectARX ACED_ARXCOMMAND_ENTRY_AUTO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include "StdAfx.h"
#include "resource.h"

#define szRDS _RXST("")

//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CArxProject2App : public AcRxArxApp {

public:
	CArxProject2App () : AcRxArxApp () {}

	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
		// TODO: Load dependencies here

		// You *must* call On_kInitAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
		
		// TODO: Add your initialization code here

		return (retCode) ;
	}

	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		// TODO: Add your code here

		// You *must* call On_kUnloadAppMsg here
		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

		// TODO: Unload dependencies here

		return (retCode) ;
	}

	virtual void RegisterServerComponents () {
	}
	
	// Modal Command with localized name
	// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject2App, MyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL)
	static void MyGroupMyCommand () {
		// Put your command code here
	}

    // Modal Command with pickfirst selection
	// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject2App, MyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
	static void MyGroupMyPickFirst () {
		ads_name result ;
		int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
		if ( iRet == RTNORM )
		{
			// There are selected entities
			// Put your command using pickfirst set code here
		}
		else
		{
			// There are no selected entities
			// Put your command code here
		}
	}

    // Application Session Command with localized name
	// ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject2App, MyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION)
	static void MyGroupMySessionCmd () {
		// Put your command code here
	}

	static int ads_MyLispFunction () {
		return (RTNORM) ;
	}
	
} ;

IMPLEMENT_ARX_ENTRYPOINT(CArxProject2App)

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject2App, MyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject2App, MyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject2App, MyGroup, MySessionCmd, MySessionCmdLocal, ACRX_CMD_MODAL | ACRX_CMD_SESSION, NULL)
ACED_ADSSYMBOL_ENTRY_AUTO(CArxProject2App, MyLispFunction, false)

定义理解

1. __declspec(selectany)         

__declspec是一个Microsoft Visual C++特定的编译器属性开关。括号中指明的是哪一个属性生效。关于__declspec的其他属性可以百度“__declspec msdn”查看微软的官方帮助。也可以参看博客中转载的文章。

c++ 中__declspec 的用法详解-面圈网 (mianshigee.com)

言归正传。__declspec(selectany)在MSDN中的说明是这样的:

Tells the compiler that the declared global data item (variable or object) is a pick-any 

COMDAT (a packaged function). At link time, if multiple a definitions of COMDAT are 

seen, the linker picks one and discards the rest. Selectany can be used in initializing 

global data defined by headers,when the same header appears in more than one 

source file. 

        简单翻译一下:告诉编译器定义的全局数据项(变量或对象)这是一套能被任意挑选的COMDAT(一套函数)。在链接时,如果多个COMDAT的定义被找到,链接器将挑选一个并剔除其他的多余的。Selectany可以被用于当定义有初始化全局变量数据的头文件被应用于多于一个的源文件时。

        直白了说:当在头文件定义全局变量,并且这个头文件被include多次时可以用这个开关剔除由于多次include而产生的重定义。

        _declspec(selectany)可以让我们在.h文件中初始化一个全局变量而不是只能放在.cpp中。比如有一个类,其中有一个静态变量,那 么我们可以在.h中通过类似" __declspec(selectany) type class::variable = value; "这样的代码来初始化这个全局变量。既是该.h被多次include,链接器也会为我们剔除多重定义的错误。这个有什么好处呢,我觉得对于 teamplate的编程会有很多便利。

(16条消息) 浅谈__declspec(selectany)该何时用_几罗星人的博客-CSDN博客

2. pragma comment

C语言Pragma 指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作

C语言之pragma用法详解 (douban.com)

pragma comment将一个注释记录放入一个对象文件或可执行文件中

比如我们连接的时候用到了WSock32.lib,你当然可以不辞辛苦地把它加入到你的工程中。但是我觉得更方便的方法是使用#pragma指示符,指定要连接的库: #pragma comment(lib, "WSock32.lib")

linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象,例如: #pragma comment(linker, "/include:__mySymbol")

3. extern "C" 是用来告诉编译器使用C的命名方式

4. __declspec(allocate("segname"))

        _declspec(allocate("segname")) 声明一个已经分配了数据段的一个数据项。它和#pragma 的code_seg, const_seg, data_seg,section,init_seg配合使用,segname必须有这些东东声明。文章来源地址https://www.toymoban.com/news/detail-438206.html

#define __declspec(method) __declspec_##method
#define ARXCOMMAND_FIRST_ENTRYNAME "ARXCOMMAND$__m"
#define ACED_ARXCOMMAND_ENTRY_PRAGMA(group,globCmd) __pragma(comment(linker, "/include:__pArxCmdMap_" #group #globCmd)) ;
#define ACED_ARXCOMMAND_ENTRY_AUTO(classname, group, globCmd, locCmd, cmdFlags, UIContext) \
    __declspec(selectany) _ARXCOMMAND_ENTRY __ArxCmdMap_##group##globCmd = { _RXST(#group), _RXST(#globCmd), _RXST(#locCmd), cmdFlags, classname::group ##globCmd, UIContext, 0 } ; \
    extern "C" __declspec(allocate("ARXCOMMAND$__m")) __declspec(selectany) _ARXCOMMAND_ENTRY*  __pArxCmdMap_##group##globCmd = &__ArxCmdMap_##group##globCmd ; \
    ACED_ARXCOMMAND_ENTRY_PRAGMA(group, globCmd)

	__declspec(selectany) _ARXCOMMAND_ENTRY __ArxCmdMap_##group##globCmd = { _\
    RXST(#group), _RXST(#globCmd), _RXST(#locCmd), cmdFlags, classname::group ##globCmd, UIContext, 0 };\
	extern "C" __declspec(allocate(ARXCOMMAND_FIRST_ENTRYNAME))\
	__declspec(selectany) _ARXCOMMAND_ENTRY*  __pArxCmdMap_##group##globCmd = &__ArxCmdMap_##group##globCmd;\
	__pragma(comment(linker, "/include:__pArxCmdMap_" #group #globCmd));

ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, MyGroup, MyCommand, helloline, ACRX_CMD_MODAL, NULL)
{
	// 初始化全局变量 __ArxCmdMap_MyGroupMyCommand
	__declspec(selectany) _ARXCOMMAND_ENTRY __ArxCmdMap_MyGroupMyCommand = { _RXST(#group), _RXST(#globCmd), _RXST(#locCmd), cmdFlags, classname::group ##globCmd, UIContext, 0 };
	// 指定C编译器 声明"ARXCOMMAND$__m"数据段
	extern "C" __declspec(allocate("ARXCOMMAND$__m"))
	// 初始化全局变量指针 __pArxCmdMap_MyGroupMyCommand
	__declspec(selectany) _ARXCOMMAND_ENTRY*  __pArxCmdMap_MyGroupMyCommand = &__ArxCmdMap_MyGroupMyCommand;
	// 指示编译器完成将一个链接选项放入目标文件,include选项来强制包含某个对象
	__pragma(comment(linker, "/include:__pArxCmdMap_" MyGroup MyCommand));
}

到了这里,关于objectARX ACED_ARXCOMMAND_ENTRY_AUTO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AutoCAD二次开发(ObjectARX/.NET) 多版本开发包兼容性

    文章来源:General Development Compatibility 一般开发兼容性 (ObjectARX/.NET) - 中文CAD开发文档,CAD二次开发问题交流,优秀插件分享  产品发布 二进制兼容版本 支持的开发环境 AutoCAD 2021 AutoCAD 2021 Windows Visual Studio 2019 Mac OS(10.13 或更高版本) Xcode : 10.2.1 Mono : 5.20.1.19 AutoCAD 202

    2024年01月20日
    浏览(53)
  • Visual Studio 2017 + ObjectARx2019 + AutoCAD2020环境搭建与工程编译问题处理

    注:以上所有安装包,序列号,注册机等资料均可私信我,免费获取,共同进步; 1、安装visual studio 2017; 2、安装AutoCAD2020;这里ObjectArx2019对应了两个CAD版本,默认是AutoCAD2019,我采用AutoCAD2020也可以; 3、安装ObjectARXWizard2019.msi;这里默认的安装路径是“C:ObjectARX”,为了避免后

    2024年02月10日
    浏览(54)
  • Objectarx 2021使用vs2019生成报错 /RTCc rejects conformant code

    error C2338: /RTCc rejects conformant code错误解决 使用VS2019/VS2022生成项目报错 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1189 #error: /RTCc rejects conformant code, so it is not supported by the C++ Standard Library. Either remove this compiler option, or define _ALLOW_RTCc_IN_STL to acknowledge that you have received

    2024年02月12日
    浏览(36)
  • import-html-entry]: error occurs while executing entry script, 乾坤加载子应用路由报错

    在乾坤框架下, 子应用技术栈是 vue, 当路由是懒加载的情况, 大概率会遇到 import-html-entry]: error occurs while executing entry script , 因为是动态加载的资源所以相关路径需要配置一下 qiankun 将会在微应用 bootstrap 之前注入一个运行时的 publicPath 变量,你需要做的是在微应用的 entry js 的

    2024年02月12日
    浏览(46)
  • python tkinter Entry的使用

    目录 前言 一、认识Entry 二、使用Entry 1.调用Entry 2.Entry **kw的属性 1) background或bg 2) borderwidth或bd 3) cursor 4) font 5) foreground或fg 6) highlightbackground,hightlightcolor和highlightthickness 7) insertbackground 8) insertwidth 9) insertofftime和insertontime 10) justify 11) selectbackground 12) selectforeground 13) show 14) stat

    2024年02月08日
    浏览(37)
  • 鸿蒙 stage 开发 arkTS 关于 @Entry使用

    最近遇到 hvigor WARN: ArkTS:WARN File: D:/myproject/MyProject/entry/src/main/ets/view/LoginPage.ets:17:1  It\\\'s not a recommended way to export struct with @Entry decorator, which may cause ACE Engine error in component preview mode. \\\'main_pages.json\\\'文件如下:   因为MainPage.ets里使用了@Entry而且LoginPage也使用了@Entry,有个重复警告

    2024年01月22日
    浏览(50)
  • python tkinter Entry控件textchange事件

    项目上需要用到一个功能,当Entry控件中的文本发生变化时触发textchange事件,获得变化后的文本内容,找了半天后发现Entry控件没有自带的textchange事件。替代方案是:给Entry控件绑定Key事件,当任意敲击键盘时触发,相当于间接实现了textchange事件,但实际使用过程发现绑定

    2024年02月04日
    浏览(63)
  • list_for_each_entry详解

    参考链接: 终于理解list_entry和list_for_each_entry linux 内核代码中list_for_each_entry宏之我见 linux之list_for_each和list_for_each_entry函数 container_of的用法 用户态下的list.h Linux内核中的许多链表操作,都是使用list_for_each_entry进行遍历,其定义在/usr/src/linux-2.6.32.9/include/linux/list.h路径,具体

    2024年02月15日
    浏览(40)
  • 【Sentinel】核心API-Entry与Context

    默认情况下,Sentinel会将controller中的方法作为被保护资源,那么问题来了,我们该如何将自己的一段代码标记为一个Sentinel的资源呢? Sentinel中的资源用Entry来表示。 声明Entry的API示例:( try后面直接加括号写上对应的资源,就不用自己再加finally语句去关闭了,即try-with-res

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包