Late binding ?



  • Hi

    Ich krieg das mit dem late binding nicht hin .

    Dazu habe ich die versucht die Dateien von Jochen Kalmbach
    einzubauen , damit ich etwas Licht im Tunnel finde.
    Jedoch kommt dabei immer der Fehler:

    d:\projekte\latebinding\INVHELP.CPP(473): fatal error C1010: 
    Unerwartetes Dateiende während der Suche nach der Direktive für die 
    vorkompilierte Headerdatei
    

    kennt jemand den Fehler ?
    oder wei wie es geht ?

    Danke und Gruß
    Linus



  • Du musst in der CPP-Datei ganz oben ein

    #include "stdafx.h"
    

    einfügen.
    Siehe: http://blog.kalmbachnet.de/?postid=63



  • Danke funktioniert:

    Wenn ich jetzt Deinen Code verwende

    LPDISPATCH pdispWord; 
    	CreateObject(OLESTR("Word.Basic"), &pdispWord); 
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
    		OLESTR("AppShow"), NULL);    
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
    		OLESTR("FileNewDefault"), NULL);  
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL,  
    		OLESTR("Insert"), TEXT("s"), (LPOLESTR)OLESTR("This is a test"));
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL,  
    		OLESTR("FileSaveAs"), TEXT("s"), OLESTR("c:\sample.doc")); 
    	pdispWord->Release(); }
    

    kommt dei Fehlermeldung :
    CreateObject keine 2 Argumente
    außerdem habe ich gesehen daß :

    extern HRESULT CreateObject(LPOLESTR pszProgID, IDispatch FAR* FAR* ppdisp);
    

    😕 Ich versuchs erstmal zu verstehen 😕



  • Hmmm... bei mir geht das folgende ohne Probleme:

    #include "stdafx.h"
    #include <windows.h>
    #include "invhelp.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      CoInitialize(NULL);
    
      LPDISPATCH pdispWord; 
      CreateObject(OLESTR("Word.Basic"), &pdispWord); 
      Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
        OLESTR("AppShow"), NULL);     
      Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
        OLESTR("FileNewDefault"), NULL);   
      Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL,   
        OLESTR("Insert"), TEXT("s"), (LPOLESTR)OLESTR("This is a test")); 
      Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL,   
        OLESTR("FileSaveAs"), TEXT("s"), OLESTR("c:\\sample.doc")); 
      pdispWord->Release();
    
      CoUninitialize();
      return 0;
    }
    


  • Ich habs in MFC-Dialog einem Button zugeordnet

    Hier den ganzen Code:

    #include "stdafx.h"
    #include <Windows.h>
    #include "latebinding.h"
    #include "latebindingDlg.h"
    #include "INVHELP.H"
    #include ".\latebindingdlg.h"
    ...
    
    void ClatebindingDlg::OnBnClickedButton1()
    {
    	CoInitialize(NULL); 
    
    	LPDISPATCH pdispWord; 
    	CreateObject(OLESTR("Word.Basic"), &pdispWord); 
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
    		OLESTR("AppShow"), NULL);     
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
    		OLESTR("FileNewDefault"), NULL);   
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL,   
    		OLESTR("Insert"), TEXT("s"), (LPOLESTR)OLESTR("This is a test")); 
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL,   
    		OLESTR("FileSaveAs"), TEXT("s"), OLESTR("c:\\sample.doc")); 
    	pdispWord->Release(); 
    
    	CoUninitialize(); 
    }
    
    d:\projekte\latebinding\latebindingDlg.cpp(159): 
    error C2660: 'CWnd::CreateObject': Funktion akzeptiert keine 2 Argumente
    

    allerdings kenne ich die Anweisung

    CoInitialize(NULL);
    

    nicht



  • achso :

    COM initialisieren mit CoInitialize

    muß ich auch noch lernen 🙂



  • Eigentlich solltest Du das CoInitialize gaaaaaaanz am Anfang machen (bzw. macht das nicht schon die MFC !? )



  • ok, ich lass es erst mal weg
    und hoffe dass MFC das schon erledigt
    jedoch bleibt da die Fehlermeldung 😞



  • Du solltest anstelle von

    CreateObject
    

    folgendes verwenden:

    ::CreateObject
    


  • Hey , Klasse So funktioniert es

    Vielen Dank für deine Hilfe

    Gruß Linus
    🙂 👍



  • Sorry wenn ich noch einmal darauf zurückkomme

    aber bei Excel scheint es doch etwas schwieriger zu sein :

    Ich hab da folgendes gefunden für VB:

    '   Dieses Beispiel zeigt, wie man die Object Library benutzt 
    '   (early binding). Möchte man "late binding" verwenden, stehen die 
    '   Werte und Datentypen dabei.
    
    '   Ein paar Variablen
    Dim xclApp As Excel.Application     '   As Object
    Dim boolAppLoad As Boolean
    Dim xclWbk As Excel.Workbook        '   As Object
    Dim boolWbkLoad As Boolean
    Dim xclSht As Excel.Worksheet       '   As Object
    Dim strFile As String
    
    '   Fehlerbehandlungsverhalten setzen
    On Error Resume Next
    
    '   Alte Fehler löschen
    Err.Clear
    
    '   Datei benennen
    strFile = "C:\My Files\zeit.xls"
    
    '   Excel referenzieren
    Set xclApp = GetObject(, "Excel.Application")
    
    '   Ist ein Fehler aufgetreten (Excel war dann nicht geladen)?
    If (Err.Number <> 0) Then
        '   Fehler löschen
        Err.Clear
    
        '   Excel war nicht geladen
        boolAppLoad = True
    
        '   Excel jetzt starten
        Set xclApp = CreateObject("Excel.Application")
    Else
        '   Excel war geladen
        boolAppLoad = False
    End If
    
    '   Workbook referenzieren
    Set xclWbk = xclApp.Workbooks.Item(strFile)
    
    '   Ist ein Fehler aufgetreten (Workbook war dann nicht geöffnet)?
    If (Err.Number <> 0) Then
        '   Fehler löschen
        Err.Clear
    
        '   Workbook war nicht geöffnet
        boolWbkLoad = True
    
        '   Workbook öffnen
        Set xclWbk = xclApp.Workbooks.Open(strFile, _
                                    , , , , , , , , , , , False)
    Else
        '   Workbook war geöffnet
        boolWbkLoad = False
    End If
    
    '   Erste Tabelle referenzieren
    Set xclSht = xclWbk.Worksheets(1)
    
    '   Hier jetzt die Verarbeitung
    [...]
    
    '   Referenz entfernen
    Set xclSht = Nothing
    
    '   Mußte das Workbook geladen werden?
    If (boolWbkLoad) Then
        '   Ja, Workbook speichern schließen
        xclWbk.Close xlSaveChanges  '   xlSaveChanges = 1
    End If
    
    '   Referenz entfernen
    Set xclWbk = Nothing
    
    '   Mußte Excel geladen werden?
    If (boolAppLoad) Then
        '   Ja, Excel beenden
        xclApp.Quit
    End If
    
    '   Referenz entfernen
    Set xclApp = Nothing
    

    Wenn ich das richtig verstanden habe muss ich jetzt entsprechend die
    Befehle und Werte mittels invoke senden .
    Nur habe ich jetzt drei Objekte :

    Application
    Workbook
    Worksheet

    Ich krieg das irgendwie nicht zusammen.

    ::CreateObject(OLESTR("Excel.Application"), &pdispWord); 
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
    		OLESTR("Workbooks.Add"), NULL);     
    	Invoke(pdispWord, DISPATCH_METHOD, NULL, NULL, NULL, 
    		OLESTR("Worksheets(1)"), NULL);
    

    Vielleicht hast Du ja noch einen kleinen Tip
    🙂


Anmelden zum Antworten