HOWTO: 使用一个在 C 应用程序,而不是 c + + 中的 OLE 自动化

文章翻译 文章翻译
文章编号: 181473 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

如果希望在 C,而不是 c + + 程序 OLE 自动化会非常困难,因为在组件对象模型 (COM),OLE 的构建基块围绕 c + + 类的二进制布局设计。头文件包含由 WINDOWS.H,但是,已内置 C 编译的支持 ; 因此,可以模拟 c + + 对象的行为,并使 OLE 自动化调用。本文介绍如何生成使用 C,启动 Excel,并使其可见 OLE 自动化通过一个 Win32 控制台应用程序。

更多信息

使用以下方法:
  1. 在 Microsoft Visual c + + 中创建一个新的"Win32 控制台应用程序"项目 5.0。
  2. 将 Main.c (不 Main.cpp) 文本文件添加到您的项目。
  3. 将下面的代码添加到 Main.c 文件:
          #include <stdio.h>
          #include <windows.h>
    
          void main(void) {
             IDispatch *pDisp; // Main IDispatch pointer.
             unsigned short *ucPtr; // Temporary variable to hold names.
             DISPID dispID; // Temporary variable to hold DISPIDs.
             CLSID clsid; // Holds CLSID of server after CLSIDFromProgID.
             HRESULT hr; // General error/result holder.
             char buf[8192]; // Generic buffer for output.
    
             // IDispatch::Invoke() parameters...
             DISPPARAMS dispParams = { NULL, NULL, 0, 0 };
             VARIANT parm1;
             DISPID dispidNamed = DISPID_PROPERTYPUT;
    
    
             // Initialize OLE Libraries.
             OleInitialize(NULL);
             {
                // Get CLSID for Excel.Application from registry.
                hr = CLSIDFromProgID(L"Excel.Application", &clsid);
                if(FAILED(hr)) {
                   MessageBox(NULL, "Excel not registered.", "Error",
                              MB_SETFOREGROUND);
                   return;
                }
                // Start Excel97, Excel 2000, or Excel 2002 and get its IDispatch pointer.
                hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER,
                                      &IID_IDispatch, (void **)&pDisp);
                if(FAILED(hr)) {
                   MessageBox(NULL, "Couldn't start Excel.", "Error",
                              MB_SETFOREGROUND);
                   return;
                }
    
                // Get the 'visible' property's DISPID.
                ucPtr = L"Visible";
                pDisp->lpVtbl->GetIDsOfNames(pDisp, &IID_NULL, &ucPtr, 1,
                                             LOCALE_USER_DEFAULT, &dispID);
    
                sprintf(buf, "DISPID for 'Visible' property = 0x%08lx",
                        dispID);
                MessageBox(NULL, buf, "Debug Notice", MB_SETFOREGROUND);
    
                // Initiate parameters to set visible property to true.
                VariantInit(&parm1);
                parm1.vt = VT_I4;
                parm1.lVal = 1; // true
    
                // One argument.
                dispParams.cArgs = 1;
                dispParams.rgvarg = &parm1;
    
                // Handle special-case for property-puts!
                dispParams.cNamedArgs = 1;
                dispParams.rgdispidNamedArgs = &dispidNamed;
    
                // Set 'visible' property to true.
                hr = pDisp->lpVtbl->Invoke(pDisp,
                   dispID, &IID_NULL, LOCALE_SYSTEM_DEFAULT,
                   DISPATCH_PROPERTYPUT | DISPATCH_METHOD,
                   &dispParams, NULL, NULL, NULL
                );
                if(FAILED(hr)) {
                   sprintf(buf, "IDispatch::Invoke() failed with %08lx", hr);
                   MessageBox(NULL, buf, "Debug Notice", MB_SETFOREGROUND);
                }
    
                // All done.
                MessageBox(NULL, "done.", "Notice", MB_SETFOREGROUND);
             }
             // Uninitialize OLE Libraries.
             OleUninitialize();
    
          }
    					
  4. 编译并运行。

参考

有关 OLE、 COM,和自动化的详细信息,请参阅该简介册"内部 OLE"通过 Kraig Brockschmidt (微软出版社)。

IDispatch 有关的详细信息,请参阅 Microsoft Visual c + + 的联机帮助。

有关 COM 的详细信息,OLE 和自动化 Excel 中使用 Microsoft Visual c + + 中,请参阅章节 23-27 日的简介册"内部 Visual c + +"通过韩建 J.Kruglinski (微软出版社)。

(c) Microsoft Corporation 1999,保留的所有权限。李先生 Crump,Microsoft 公司的贡献。

属性

文章编号: 181473 - 最后修改: 2007年2月12日 - 修订: 4.3
这篇文章中的信息适用于:
  • Microsoft Excel 2000 标准版
  • Microsoft Visual C++ 4.0 标准版
  • Microsoft Visual C++ 5.0 企业版
  • Microsoft Visual C++ 6.0 企业版
  • Microsoft Visual C++ 5.0 专业版
  • Microsoft Visual C++ 6.0 专业版
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Excel 2002 标准版
  • Microsoft Excel 97 标准版
关键字:?
kbmt kbhowto KB181473 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 181473
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com