那个C或C++高手指点一下!纯C 调用 tlb 类型库或 ActiveX 部件的方法! 
实现 Automation
就是不使用 VC 的 IDE 坏境的情况下!如何使用纯C实现?关于这个问题已经困扰我很久了!在网上查过无数资料都是使用VC的IDE的!

解决方案 »

  1.   

    很久以前的 , 操作 excel 的, 用 C 操作COM对象没有啥意义, 又慢又不方便..
    对了, 啥叫使用 VC IDE 的, 啥叫不使用IDE的 ....#define COBJMACROS
    #include <windows.h>
    #include <stdio.h>// {00024500-0000-0000-C000-000000000046}
    static const GUID guidExcelApplication = 
    { 0x00024500, 0x0, 0x0, { 0xC0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46 } };DISPPARAMS nullParam = { NULL , NULL , 0 , 0 };IDispatch* OpenExcelWorkBook( LPCWSTR strFileName )
    {
    IDispatch *pExcelApp = NULL , *pWSP = NULL, *pWB = NULL; VARIANT varResult = { VT_EMPTY } , 
    varParam[4] = { { VT_EMPTY } , { VT_EMPTY } , { VT_EMPTY } , { VT_EMPTY } } ;

    HRESULT hr = CoCreateInstance( 
    &guidExcelApplication , NULL , CLSCTX_LOCAL_SERVER ,
    &IID_IDispatch , (void**)&pExcelApp ); if( FAILED( hr ) )
    {
    fprintf( stderr , "Create Excel Application Object Failed.\n" );
    exit( 10 );
    } // property Workbooks.
    hr = IDispatch_Invoke( pExcelApp , 0x0000023c , &IID_NULL , LOCALE_SYSTEM_DEFAULT , 
    DISPATCH_PROPERTYGET , &nullParam , &varResult , NULL , NULL ); if( FAILED( hr ) || varResult.vt != VT_DISPATCH || !varResult.pdispVal )
    {
    fprintf( stderr , "Get Work Books Failed.\n" );
    exit( 10 );
    } IDispatch_Release( pExcelApp ); pExcelApp = NULL; pWSP = varResult.pdispVal; varResult.vt = VT_EMPTY; {
    DISPPARAMS dispParams = { varParam , NULL , 1 , 0 };
    varParam[0].vt = VT_BSTR;
    varParam[0].bstrVal = SysAllocString( strFileName ); // method Open.
    hr = IDispatch_Invoke( pWSP ,
    0x00000783 , &IID_NULL , LOCALE_SYSTEM_DEFAULT ,
    DISPATCH_METHOD , &dispParams , &varResult , NULL , NULL ); VariantClear( &varParam[0] );
    } if( FAILED( hr ) || varResult.vt != VT_DISPATCH || !varResult.pdispVal )
    {
    fprintf( stderr , "Open file failed.\n" );
    exit( 10 );
    } IDispatch_Release( pWSP ); pWSP = NULL;
    pWB = varResult.pdispVal; varResult.vt = VT_EMPTY; return pWB;
    }void slove( IDispatch* pWB )
    {
    IDispatch *pSheets = NULL; VARIANT varResult = { VT_EMPTY };
    IDispatch *pSheet  = NULL , *pRange = NULL;

    // Sheets 
    HRESULT hr = IDispatch_Invoke( pWB , 0x000001e5 , &IID_NULL , LOCALE_SYSTEM_DEFAULT , 
    DISPATCH_PROPERTYGET , &nullParam , &varResult , NULL , NULL ); if( FAILED( hr ) || varResult.vt != VT_DISPATCH || !varResult.pdispVal )
    {
    fprintf( stderr , "Get Work Books Sheets Failed.\n" );
    exit( 10 );
    } pSheets = varResult.pdispVal; varResult.vt = VT_EMPTY; {
    VARIANT varParam = { VT_I4 , 1 };
    DISPPARAMS dispParam = { &varParam , NULL , 1 , 0 };
    // items.
    hr = IDispatch_Invoke( pSheets , 0 , &IID_NULL , LOCALE_SYSTEM_DEFAULT , 
    DISPATCH_PROPERTYGET , &dispParam , &varResult , NULL , NULL );
    if( FAILED( hr ) || varResult.vt != VT_DISPATCH || !varResult.pdispVal )
    {
    fprintf( stderr , "Get Work Sheet failed.\n" );
    exit( 10 );
    } pSheet = varResult.pdispVal; varResult.vt = VT_EMPTY;
    } IDispatch_Release( pSheets ); pSheets = NULL; {
    // Cells.
    hr = IDispatch_Invoke( pSheet , 0x000000ee , &IID_NULL , LOCALE_SYSTEM_DEFAULT , 
    DISPATCH_PROPERTYGET , &nullParam , &varResult , NULL , NULL );
    if( FAILED( hr ) || varResult.vt != VT_DISPATCH || !varResult.pdispVal )
    {
    fprintf( stderr , "Get Work Sheet failed.\n" );
    exit( 10 );
    } pRange = varResult.pdispVal; varResult.vt = VT_EMPTY;
    } IDispatch_Release( pSheet ); pSheet = NULL; {
    VARIANT varParam[2] = { { VT_I4 , 1 } , { VT_I4 , 1 } };
    // Cell( 1 , 1 )
    DISPPARAMS dispParam = { varParam , NULL , 2 , 0 }; hr = IDispatch_Invoke( pRange , 0 , &IID_NULL , LOCALE_SYSTEM_DEFAULT , 
    DISPATCH_PROPERTYGET , &dispParam , &varResult , NULL , NULL );
    } if( SUCCEEDED( hr ) && 
    SUCCEEDED( VariantChangeType( &varResult , &varResult , 0 , VT_BSTR  ) ) )
    {
    MessageBoxW( NULL , varResult.bstrVal , L"HEHE" , MB_OK );
    }

    IDispatch_Release( pRange ); pRange = NULL;
    VariantClear( &varResult );
    }void foobar()
    {
    IDispatch* pWB = OpenExcelWorkBook( L"D:\\11.xls" );
    slove( pWB );
    IDispatch_Release( pWB );
    }int main()
    {
    CoInitialize( NULL );
    foobar();
    CoUninitialize();
    }
      

  2.   

    #improt "lib.dll"
    然后就能生成相应的.h .c文件,里面有com对象的c版和c++版声明。
    有声明的话,调用就没啥问题了吧。
      

  3.   

    mLee79() 和 akirya(坏[其实偶不是什么所谓的坏人]) 的都是可以的一个是针对没有IDL或者typelib的
    一个是借助VC IDE和typelib的