本文迁移自本人网易博客,写于2011年10月8日
首先是运行时提示:试图执行系统不支持的操作。
添加CAcModuleResourceOverride resourceOverride; 后,编译出现如下错误:
error C2065: “CAcModuleResourceOverride”: 未声明的标识符 添加头文件 #include <AcExtensionModule.h> 后出现如下错误: error LNK2019: 无法解析的外部符号 "private: static class CAcExtensionModule & CAcModuleResourceOverride::m_extensionModule" (?m_extensionModule@CAcModuleResourceOverride@@0AAVCAcExtensionModule@@A),该符号在函数 "public: __thiscall CAcModuleResourceOverride::CAcModuleResourceOverride(void)" (??0CAcModuleResourceOverride@@QAE@XZ) 中被引用
以下是我2011年4月2日记录的内容:
1、运行时,执行到对话框的OnInitialDialog()时,提示“试图执行系统不支持的操作”!
解决方法:
为了防止资源冲突这种问题,可以在该应用程序的与工程同名的源文件中包含头文件
“#include "AcExtensionModule.h"”,然后在加载对话框的函数中添加语句
“CAcModuleResourceOverride resOverride;”,就可以解决这个问题。
看到CSDN论坛中有人说:此问题通常是删除控件后 没有把 DoDataExchange 里的对应代码删除导致
控件和 变量 的绑定出错,我将DoDataExchange 中代码屏蔽就不会出现“试图执行系统不支持的操作”的错误了。
但是打开的窗口是别的窗体,说明当前窗口资源ID和其他的冲突了。
创建工程时,应该选择
1、创建工程时,选择MFC Extension DLL [using shared MFC DLL],
2、CAcModuleResourceOverride的使用;
使用这个类可以在资源提供者之间切换,当对象创建时,一个新的资源提供者将会转换到其内,当对象被删除时,原来的资源提供者将被恢复。下面的代码提供了一个例子:
void MyFunc(){ CAcModuleResourceOverride myResources;}
在进入这个函数时,模块的资源被选中。当函数返回时,缺省资源将被恢复。这个类有以下几种用法:
A. 使用缺省构造函数(没有参数)切换到模块资源,缺省的资源在析构函数里将被恢复。在这里模块资源和缺省资源都是被DLL的CAcExtensionModule管理的。
B. 将NULL(或0)传递给构造函数,DLL的资源将被选中,而有效的资源将在类对象被删除时恢复。
C. 传递一个非空参数给构造函数,相关的模块资源将被选中,在类对象被删除时有效的资源将被恢复。
D. 在开发工具中提供了AC_DECLARE_EXTENSION_MODULE和AC_IMPLEMENT_EXTENSION_MODULE两个宏用来帮助用户在应用程序中定义和重载这个类。
3、只有属性中设置动态DLL后,在与程序名同名的源文件中才会添加动态DLL接口函数:
AC_IMPLEMENT_EXTENSION_MODULE(CADUIManagerDLL)
// DLL 入口点
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
_hdllInstance = hInstance;
JtDrawPipeDLL.AttachInstance(hInstance);
InitAcUiDLL();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
JtDrawPipeDLL.DetachInstance();
}
return TRUE;
}
到了这里,仍提示 InitAcUiDLL()未声明,需包含 adui.h,acui.h,原因如下:
4、 AutoCAD界面库AdUi、AcUi的使用
AdUi库是MFC扩展的动态链接库,用来扩展MFC的一些与用户界面相关的类,这个库是为使用AutoCAD和其他包含核心功能的Autodesk产品而开发的。AcUi库则是在AdUi的框架上建立的,提供了AutoCAD指定的外观和行为。AdUi和AcUi库提供了扩展的MFC类,这些类允许ARX开发者使用和AutoCAD一样的用户界面功能。MFC开发者可以无缝地使用这些库。下面将对AdUi和AcUi库提供的主要功能进行介绍。
要在一个MFC应用程序中使用AdUi库,在用户创建的工程中必须包含adui.h,同时,工程应该与adui15.lib链接(adui15.dll的输入库)。要在一个MFC应用程序中使用AcUi库,必须包含adui.h和acui.h,同时与adui15.lib和acui15.lib链接。AutoCAD调用库的初始化函数InitAcUiDLL(),而这个函数将调用AdUi库的初始化函数InitAdUiDLL(),所以应用程序不需要调用这两个库的初始化函数。