ΔΙΑΔΙΚΑΣΙΕΣ: Χρήση αυτοματισμού OLE από μια εφαρμογή c αντί να C++

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 181473 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Εάν χρειάζεται να προγραμματίσει C, παρά C++, μπορεί να είναι αυτοματισμού OLE δύσκολο, επειδή το στοιχείο αντικείμενο Model (COM), τα δομικά στοιχεία OLE, έχει σχεδιαστεί γύρω από τη δυαδική διάταξη κλάσης C++. Τα αρχεία κεφαλίδας περιλαμβάνονται τα WINDOWS.H, ωστόσο, έχουν ενσωματωμένη υποστήριξη για c μεταγλωττίσεις. Επομένως, μπορείτε να μιμηθεί τη συμπεριφορά ενός αντικειμένου C++ και να κάνετε OLE Κλήσεις αυτοματισμού. Αυτό το άρθρο περιγράφει τον τρόπο δημιουργίας μιας κονσόλας Win32 εφαρμογή, χρησιμοποιώντας C, που ξεκινά το Microsoft Excel και καθιστά ορατή VIA αυτοματισμού OLE.

Περισσότερες πληροφορίες

Χρησιμοποιήστε την ακόλουθη μέθοδο:
  1. Δημιουργία νέου έργου "Win32 εφαρμογής κονσόλας" στο Microsoft Visual C++ 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 (Microsoft Press).

Για περισσότερες πληροφορίες σχετικά με τις διασυνδέσεις IDispatch, συμβουλευτείτε το Microsoft Visual C++ ηλεκτρονική Βοήθεια.

Για περισσότερες πληροφορίες σχετικά με το COM, OLE και automating χρησιμοποιώντας το Microsoft Excel Microsoft Visual C++, δείτε 23-27 κεφάλαια του βιβλίου "Μέσα σε Visual C++" Γιώργος J. Kruglinski (Microsoft Press).

(c) 1999 Microsoft Corporation, κάθε νόμιμου δικαιώματος. Συνεισφορές από όνομα Joe Crump, Microsoft Corporation.

Ιδιότητες

Αναγν. άρθρου: 181473 - Τελευταία αναθεώρηση: Πέμπτη, 27 Ιανουαρίου 2011 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
Λέξεις-κλειδιά: 
kbhowto kbmt KB181473 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:181473

Αποστολή σχολίων

 

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