MSV6 win32 dll comobject Excel Quit/Close geht nicht!
-
hab nicht genau gewust wohin mit der frage da diese irgendwie in keins der themen past
naja mal guckn
Also (bin noch ziemlich neu bei c++) habe ne com automation gemacht für Excel
problemm ist das unladen geht nicht die excel.exe bleibt in memory obwohl ich
quit und close funktionen aufrufe und auch die objekte auf null setze!
Header:#include "comdef.h" class ITXls { public: void Close(); int SaveAs(char sFromfile [256],char sTofile [256],int delsource); private: IDispatchPtr m_spIExcelApp; IDispatchPtr m_spWorkbook; };Quellcode:
#include <afx.h> #include "ITExcel.h" #include "stdafx.h" #include "atlbase.h" CComModule _Module; #include "atlcom.h" //#import "\\S-itwienstore\SLWS\Office2003\FILES\PFILES\MSOFFICE\OFFICE11\XL5EN32.OLB" // Funktion ITExcel int __stdcall ITExcel_SaveAs(char sFromfile [256],char sTofile [256],int delsource) { if (sFromfile == NULL || sTofile == NULL) return 1; int retval; ITXls ITWork; retval = ITWork.SaveAs(sFromfile,sTofile,delsource); ITWork.Close(); return retval; } void ITXls::Close() { if (m_spIExcelApp != NULL) { VARIANT vResult; CComDispatchDriver spDispExcel(m_spIExcelApp); HRESULT hr = spDispExcel.Invoke0(L"Quit", &vResult); m_spIExcelApp.Release(); m_spWorkbook.Release(); spDispExcel.Release(); CComDispatchDriver::Release; //also hier versuche ich wircklich alles aber bringt nix!!!! } } int ITXls::SaveAs(char sFromfile [256],char sTofile [256],int delsource) { const xlNormal = -4143; //xls const xlCSV = 6; //csv const xlXMLSpreadsheet = 46; //xml CLSID clsidExcelApplication; HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsidExcelApplication); _ASSERT(SUCCEEDED(hr)); if (FAILED(hr)) return 1; hr = CoCreateInstance(clsidExcelApplication, NULL, CLSCTX_SERVER, IID_IDispatch, (void **) (IDispatch *) &m_spIExcelApp); _ASSERT(SUCCEEDED(hr)); _ASSERT(m_spIExcelApp != NULL); if (FAILED(hr) || (m_spIExcelApp == NULL)) return 1; CComDispatchDriver spDispExcel(m_spIExcelApp); VARIANT vResult; { DISPID dispidWorkbooks = 0; hr = spDispExcel.GetIDOfName(L"Workbooks", &dispidWorkbooks); hr = spDispExcel.GetProperty(dispidWorkbooks, &vResult); } if (FAILED(hr) || (vResult.pdispVal == NULL)) return 1; CComDispatchDriver spWorkbooks(vResult.pdispVal); { USES_CONVERSION; VARIANT vFilename; vFilename.vt = VT_BSTR; vFilename.bstrVal = SysAllocString(A2CW(sFromfile)); hr = spWorkbooks.Invoke1(L"Open", &vFilename, &vResult); SysFreeString(vFilename.bstrVal); } if (FAILED(hr)) return 2; { hr = spDispExcel.GetPropertyByName(L"ActiveWorkbook", &vResult); if (FAILED(hr)) return 3; m_spWorkbook = vResult.pdispVal; } if (m_spWorkbook == NULL) return 3; CComDispatchDriver spDispWorkbook(m_spWorkbook); { USES_CONVERSION; VARIANT vFilename, vFileFormat; vFilename.vt = VT_BSTR; vFilename.bstrVal = SysAllocString(A2CW(sTofile)); vFileFormat.vt = VT_I4; CString extension; extension = sTofile; extension = extension.Right(3); if (extension == "xls" || extension == "XLS") vFileFormat.lVal = xlNormal; if (extension == "csv" || extension == "CSV") vFileFormat.lVal = xlCSV; if (extension == "xml" || extension == "XML") vFileFormat.lVal = xlXMLSpreadsheet; hr = spDispWorkbook.Invoke2(L"SaveAs", &vFilename, &vFileFormat, &vResult); SysFreeString(vFilename.bstrVal); } if (FAILED(hr)) return 2; VARIANT vAntwort; vAntwort.vt = VT_I4; vAntwort.lVal = 1; hr = spDispWorkbook.Invoke1(L"Close", &vAntwort, &vResult); if (delsource > 0) { BOOL bSuccess = DeleteFile(sFromfile); if (!bSuccess) { return 2; } } return 0; }Export.def:
EXPORTS ITExcel_SaveAs @1Die excel exe bleibt immer offen wird nicht geschlossen

ich kann nicht hergehn und einfach blind alle excel progs killen
aber close/quit funktioniert nicht
und ich habe keine ahnung wie ich die progid oder hwnd von den pointer bekommen kann(ob das überhaupt geht?) dammit ich die exe halt auf die sendmessage art killekann mir einer bei den problemm helfen?
(wie gesagt bin ehr neu komme selbst nicht drauf warum es offen bleibt)
entweder mir erklären wie ich auf die progid oder hwnd der instanz komme
oder mir erklären warum der $&#!@ nicht zugeht
-
Das Gefühl das du neu bist hab ich auch wenn ich den Code sehe

1.) Wenn du SmartPointer verwendest kannst du dir das Release schenken.
2.) Warum arbeitest du eigentlich mit dem Dispatch-Interface ? Magst du gerne komplizierten Programmcode. "#import..."
3.) Wo und wann rufst du eigentlich CoInitializeEx() und CoUninitialize() auf.
4.) Du exportierst ne Funktion und implementierst ne Klasse
Wie erzeugst du den eine Instanz deiner Klasse in der Anwendung. Wie werden den die Instanzdaten verwaltet ??Sorry, aber für mich passt das vorne und hinten nicht zusammen. C++ und COM auf einen Schlag zu lernen ist ein ziemlicher Hammer. Ich will dir nichts böses, aber bei der COM-Programmierung hast du als Anfänger mit VB(6) wesentlich bessere Karten.
mfg JJ
-
..also für solche antworten habe ich eigentlich nicht hier gepostet
dachte hier kommen helfende antworten ..vb kann/will ich nicht nehmen da du die activex dll erst registieren must
warum so kompleziert is einfach
weil ich nicht die includes der ms produkte benutzen will
da von excel zu excel version verschiedene parameter anzahlen sind
zb öffnen 12parms excel97,16parms excel2002,15parms excel2003
auf diese art funktioniert es mit jeder excel version
ich hatte es ursprünglich ohne klasse
hatte aber das gleiche problemm habe dann gelesen das der grund angeblich (dieses problemm haben mehrere in vb sowie c++)
warum die exe nicht ungeladen wird sei weil es nicht in ner klasse is darum hab ichs dann so umgeschrieben geht aber eh auch nichtso abgesehn von diesen unsinnigen antworten da hat wer von euch eine antwort die mir auch hilft? bei meinen problemm "ernsthaft" !!!!?
und wegen vorne und hinten
na was?
ich rufe ne funktion auf aus nen anderen program (ITExcel_SaveAs mit den parms
nehme die klasse und füre die verarbeitung durch)
..abgesehn davon funktioniert es einwandfrei bis auf das schließen
und genau da wollte ich ne hilfe
und keine kritik "ohh man dein code is aber scheise nimm vb..."
meiner meinung nach war dir einfach fad und du hast dir gedacht boaaa is mir fad schreiben wir mal irgendwas oder du hast dir nicht mein problemm angeschaut k/a was von beiden
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum MFC mit dem Visual C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
1.) Habe ich Bezug auf deine eigene Aussage genommen, das du dich selbst als Anfänger bezeichnest und dir mit VB6, aus diesem Grund, eine durchaus ernstgemeinde Alternative genannt.
2.) Habe ich dir konstruktive Fragen gestellt um dein Problem näher einzukreisen bzw. um deine Vorgehensweise überhaupt zu verstehen.
3.) Wenn du keine Kritik vertragen kannst bist du hier wahrscheinlich verkehrt.
-
ok dann versuch ichs mal so:
ja ich bin neu bei c++
aber mir zu sagen dann nimm vb6 is ja nicht gerade ne glanzleistung?
und das is in meinen augen in nen c++ forum keine gute kritik!
da wäre es besser mir zu helfen das aus der c++ dll was wird? oder?
(abgesehn davon sagte ich schon activex muß man registrieren das will ich nicht! das es einfacher ist weis ich auch)wegen der coinitialize geschichte:
glaube ich? nicht das ich es brauche wenn ichs so mache (CoCreateInstance)
sonst hätte ich ja schon nen fehler bekommen das es fehlt..du kannst ja den code mal testen.. wirst sehn alles geht bis auf das schließen
ich habe weiters auch gelesen das wenn (typische MS antwort)
bestimmte aktion von user gemacht wurde (anzahl) die exe auch nicht mehr geschlossen wird (wie viel die anzahl is steht bei ms nicht...aber glaube nicht das es daran liegt da die einzige user interaktion überschreiben sein könnte und das nicht der fall ist)habe dann versucht die excel anwendung sichtbar zu machen
wenn ich die dll ausführe über zb ein test vb programm oder dataflex
wird beim quit die excel app unsichtbar aber quited auch nichtwie gesagt klasse hatte ich gemacht weil ich in verschiedenen (waren zwar meist vb foren) das problemm dort auch gesehn habe
und scheinbar war der grund das es noch immer in memory ist nach den ende (das es nicht in ner klasse ist...)
und es "angeblich behoben wird wenn mans in ner klasse macht"na ja ich glaube das ich irgendwas vergesse/falsch mache beim zerstören der excel app und genau da hätte ich halt gehoft hilft mir wer!
-
-
hey danke!
sieht ja gut aus (schön zu sehn das es da so viele problemme gibt
naja *g*
werds so bald wie möglich testen
und posten obs mein problemm behoben hat
nochmal thx
-
Hallo,
ich hab mir nicht den ganzen code angeschaut aber als rahmen um das cocreateinstance solltest du sowas in der art nehmen
if (( hr = CoCreateInstance(clsidExcelApplication, NULL, CLSCTX_SERVER, IID_IDispatch, (void **) (IDispatch
&m_spIExcelApp);) == S_OK)
{
....m_spIExcelApp->Release();
}markus