EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1408|回复: 12
打印 上一主题 下一主题

[混合编程] ObjectArx中使用.Net代码

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12406

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 16:30:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

VS2005+ARX2008向导生成项目的时候,选上.Net mixed managed code。
由于.Net初始化的时候,可能会和DLL入口函数DllMain冲突。
首先得去掉入口函数,连接选项打开NoEntry. 这样就编译通过,但去掉入口函数的同时,产生两个问题:
1、此DLL的C运行库没初始化,静态,全局变量不能被正确使用,AutoCAD下load此DLL(ARX)的时候可能会致命错误;
2、_hdllInstance未初始化,DLL资源没法使用,对话框,图标,字符串全部Load失败,CAcModuleResourceOverride也失败。

解决第1个问题:分别在On_kInitAppMsg、和On_kUnloadAppMsg下调用__crt_dll_initialize,__crt_dll_terminate;
第2个问题,AfxGetInstanceHandle,GetModuleHandle都不好使。最后才查到利用VirtualQuery调用MEMORY_BASIC_INFORMATION,取其AllocationBase作为_hdllInstance。

网友实现:

#if _MSC_VER >= 1300    // for VC 7.0
// from ATL 7.0 sources
#ifndef _delayimp_h
extern "C" IMAGE_DOS_HEADER __ImageBase;
#endif
#endif

HMODULE GetCurrentModule()
{
#if _MSC_VER < 1300    // earlier than .NET compiler (VC 6.0)

MEMORY_BASIC_INFORMATION mbi;
static int dummy;
VirtualQuery( &dummy, &mbi, sizeof(mbi) );

return reinterpret_cast<HMODULE>(mbi.AllocationBase);

#else    // VC 7.0

// from ATL 7.0 sources

return reinterpret_cast<HMODULE>(&__ImageBase);
#endif
}

《WINDOWS核心编程》里面的源代码:

/******************************************************************************
Module:  ImgWalk.cpp
Notices: Copyright (c) 2000 Jeffrey Richter
******************************************************************************/


#include "..\CmnHdr.h"     /* See Appendix A. */
#include <tchar.h>
#include "stdio.h"

///////////////////////////////////////////////////////////////////////////////


BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad) {
   if (fdwReason == DLL_PROCESS_ATTACH) {
      char szBuf[MAX_PATH * 100] = { 0 };

      PBYTE pb = NULL;
      MEMORY_BASIC_INFORMATION mbi;
      while (VirtualQuery(pb, &mbi,sizeof(mbi)))
      {

         int nLen;
         char szModName[MAX_PATH];

         if (mbi.State == MEM_FREE)
            mbi.AllocationBase = mbi.BaseAddress;

         if ((mbi.AllocationBase == hinstDll) ||
             (mbi.AllocationBase != mbi.BaseAddress) ||
             (mbi.AllocationBase == NULL)) {
            // Do not add the module name to the list
            // if any of the following is true:
            // 1. If this region contains this DLL
            // 2. If this block is NOT the beginning of a region
            // 3. If the address is NULL
            nLen = 0;
         } else {
            nLen = GetModuleFileNameA((HINSTANCE) mbi.AllocationBase,
               szModName, chDIMOF(szModName));
         }
         if (nLen > 0) {
            wsprintfA(strchr(szBuf, 0), "\n%p--%08X--=%s",
               mbi.AllocationBase,mbi.RegionSize, szModName);
         }
         pb += mbi.RegionSize;
         
      }


      chMB(&szBuf[1]);
   }

   return(TRUE);
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

0

主题

836

帖子

1198

积分

BIM项目负责人

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

积分
1198
2F
发表于 2014-3-14 11:37:22 | 只看该作者
路过!!! 不发表意见……

1

主题

842

帖子

1254

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1254
6F
发表于 2014-6-11 18:11:58 | 只看该作者
(*^__^*) 嘻嘻……

5

主题

726

帖子

1692

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1692
10F
发表于 2014-6-13 14:25:48 | 只看该作者
顶......
楼下跟上.....

11

主题

846

帖子

1772

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1772
11F
发表于 2014-6-13 14:37:39 | 只看该作者
顶......
楼下跟上.....
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-27 11:59

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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