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 Headerdateikennt 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 Argumenteallerdings 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
CreateObjectfolgendes 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 = NothingWenn ich das richtig verstanden habe muss ich jetzt entsprechend die
Befehle und Werte mittels invoke senden .
Nur habe ich jetzt drei Objekte :Application
Workbook
WorksheetIch 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
