我在通过自动化调用Excel时遇到了问题,希望高手帮忙解决一下。   
  开发用的环境是Windows   xp   sp2,   Visual   studio   2005,   Office2003   
  以前用Visual   studio   2002   和   2003   都没有问题,通过导入类型库调用   
  Excel一点问题都没有,但是使用VS2005问题就出来,google了半天,   
  也有人遇到同样问题,但是没有任何有效的解决办法。估计是2005才出来   
  的原因吧。   
    
  问题描述如下:   
  通过VS2005的添加类功能,选择Typelib类添加,   
  选择“Microsoft   Excel   11.0   Object   Library<1.5>”   
  选择接口_Application,   _Workbook,   _Worksheet,   
  由接口生成类CApplication,   CWorkbook,   CWorksheet.   
  如果单纯使用这三个类的话也没有什么问题,一切和以前一样没有问题。   
  但是如果选择接口Workbooks,Worksheets,生成类CWorkbooks,   CWorksheets.   
  这个时候问题就出现了。   
  由此生成的头文件前面都加上了#import   "C:\\Program   Files\\Microsoft   Office\\OFFICE11\\EXCEL.EXE"   
  这和以前的版本是不一样的,以前的VS版本没有这一句,应该是VS2005的新特性。   
  就这么使用的话,一编译会出现大量的错误,   
  由以前的经验可以知道是由于命名冲突导致的。于是使用rename进行重命名,   
  以前的错误虽然不出现了,但是又出现新的错误,于是定义namespace,还是不行,   
  我基本上所有能想到的组合都使用过了,还是错误。   
  试验中的头文件一部分代码如下:   
  #import   "C:\\Program   Files\\Common   Files\\Microsoft   Shared\\OFFICE11\\MSO.DLL"   \   
          rename("RGB",   "ExclRGB")   \   
          rename("DocumentProperties",   "ExclDocumentProperties")   \   
          rename("SearchPath",   "ExclSearchPath")   
    
  #import   "C:\\Program   Files\\Common   Files\\Microsoft   Shared\\VBA\\VBA6\\VBE6EXT.OLB"     
    
  #import   "C:\\Program   Files\\Microsoft   Office\\OFFICE11\\EXCEL.EXE"   \   
          rename("DialogBox",   "ExclDialogBox")   \   
          rename("RGB",   "ExclRGB")   \   
          rename("CopyFile",   "ExclCopyFile")   \   
          rename("ReplaceText",   "ExclReplaceText")   
    
  using   namespace   Excel;   
    
  察看了自动生成的头文件CWorkbooks.h里面的一个函数   
  Application   get_Application()   
  {   
  Application   result;   
  InvokeHelper(0x94,   DISPATCH_PROPERTYGET,   VT_DISPATCH,   (void*)&result,   NULL);   
  return   result;   
  }   
  而VS2005以前的版本生成的代码如下:   
  LPDISPATCH   get_Application()   
  {   
  LPDISPATCH   result;   
  InvokeHelper(0x94,   DISPATCH_PROPERTYGET,   VT_DISPATCH,   (void*)&result,   NULL);   
  return   result;   
  }   
  当然还有其他的不同。   
  估计就是由这个新类型Application导致的问题。   
    
  如果头文件不做任何修改如下   
  #import   "C:\\Program   Files\\Microsoft   Office\\OFFICE11\\EXCEL.EXE"   no_namespace   
  那么产生的一部分代表性错误如下:   
  c:\work\powerpointautomation\autoproject\autoproject\capplication.h(3)   :   warning   C4278:   'RGB':   identifier   in   type   library   'C:\\Program   Files\\Microsoft   Office\\OFFICE11\\msppt.olb'   is   already   a   macro;   use   the   'rename'   qualifier   
    
  c:\work\powerpointautomation\autoproject\autoproject\debug\msppt.tlh(414)   :   error   C2371:   'FontPtr'   :   redefinition;   different   basic   types   
    
  c:\program   files\microsoft   visual   studio   8\vc\include\comdef.h(312)   :   see   declaration   of   'FontPtr'   
    
  c:\work\powerpointautomation\autoproject\autoproject\debug\msppt.tlh(1130)   :   error   C2146:   syntax   error   :   missing   ';'   before   identifier   'GetRGB'   
    
  c:\work\powerpointautomation\autoproject\autoproject\debug\msppt.tlh(1963)   :   error   C2061:   syntax   error   :   identifier   'MsoRGBType'   
  这个问题困扰我很长时间了。微软这套东西是越来越复杂化,这样下去完全跟不上了。   
  请高手帮组解决这个问题。谢谢大家。 
以上为huanghk 在2006-04-18 16:30:19 时发的帖子
小弟现在碰到同样的问题,拿出来让大家帮忙,先谢了!

解决方案 »

  1.   

    所有接口文件中的#import  "C:\\Program  Files\\Microsoft  Office\\OFFICE11\\EXCEL.EXE"  no_namespace  删掉试试!
      

  2.   

    wo也遇到类似的错误:(用得wps里的文件)
    >QWEDlg.cpp
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(2529) : error C2504: “KsoPictureFormat”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(2533) : error C2504: “KsoAdjustments”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9319) : error C2146: 语法错误 : 缺少“;”(在标识符“COMAddIns”的前面)
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9319) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9319) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9355) : error C2146: 语法错误 : 缺少“;”(在标识符“AdvApiRoot”的前面)
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9355) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9355) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9583) : warning C4183: “GetTaskPanes”: 缺少返回类型;假定为返回“int”的成员函数
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(14584) : error C2504: “KsoShape”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(14920) : error C2504: “KsoShapeRange”: 未定义基类1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(17536) : error C2504: “_KsoDiagramNodeChildren”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18815) : error C2143: 语法错误 : 缺少“;”(在“ET::_Application::GetCOMAddIns”的前面)
    “ET::_Application::GetTaskPanes”的前面)
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18869) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18869) : error C2497: “TaskPanesPtr”: “implementation_key”只能应用于函数声明
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18869) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>生成日志保存在“file://l:\Project\MFC\QWE\QWE\Debug\BuildLog.htm”
    1>QWE - 53 个错误,3 个警告
      

  3.   

    wo也遇到类似的错误:(用得wps里的文件)
    >QWEDlg.cpp
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(2529) : error C2504: “KsoPictureFormat”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(2533) : error C2504: “KsoAdjustments”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9319) : error C2146: 语法错误 : 缺少“;”(在标识符“COMAddIns”的前面)
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9319) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9319) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9355) : error C2146: 语法错误 : 缺少“;”(在标识符“AdvApiRoot”的前面)
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9355) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9355) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(9583) : warning C4183: “GetTaskPanes”: 缺少返回类型;假定为返回“int”的成员函数
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(14584) : error C2504: “KsoShape”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(14920) : error C2504: “KsoShapeRange”: 未定义基类1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(17536) : error C2504: “_KsoDiagramNodeChildren”: 未定义基类
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18815) : error C2143: 语法错误 : 缺少“;”(在“ET::_Application::GetCOMAddIns”的前面)
    “ET::_Application::GetTaskPanes”的前面)
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18869) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18869) : error C2497: “TaskPanesPtr”: “implementation_key”只能应用于函数声明
    1>l:\project\mfc\qwe\qwe\debug\etapp.tlh(18869) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    1>生成日志保存在“file://l:\Project\MFC\QWE\QWE\Debug\BuildLog.htm”
    1>QWE - 53 个错误,3 个警告