[C++] Excel automatisieren über MFC - Problemo

  • Ersteller Ersteller MeLLe
  • Erstellt am Erstellt am
M

MeLLe

Gast
Servus,
heute muss ich mal ein C++-Problem auf'n Tisch werfen.

Folgende Situation:
Ich möchte per C++-MFC-DLL die Arbeit mit Excel unter VB beschleunigen, indem
ich einfach zeitraubende Funktionen nicht von VB über das Excel-Objekt, sondern
über Aufrufe einer externen DLL ausführen will. Soweit so gut. Die DLL steht auch
soweit schon, das einzige Problem liegt an der Übergabe bzw. Konvertierung eines Strings.

Auszugweise hier der Code der VB-Anwendung:
Code:
Private Declare Function OpenWorkBook Lib "meine_dll.dll" (ByVal fname As String) As Boolean

Public Sub xyz()
	.
	.
	.
	Dim file_name as String
	file_name = "x:\\test.xls"
	OpenWorkBook file_name
	.
	.
	.
End Sub

Dazu hier der Code der aufgerufenen DLL-Funktion:
Code:
extern "C" __declspec(dllexport) bool OpenWorkBook(const char* fname)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());	

	books = app.GetWorkbooks();
	book = books.Add(covOptional);
	sheets = book.GetSheets();
	sheet = sheets.GetItem(COleVariant((short)1));
	
AfxMessageBox(fname);
	
	COleVariant	filename	= (LPCTSTR)fname,
			fileformat	= (long)-4143,
			passw		= (long)NULL,
			wrespassw	= (long)NULL,
			readonlyrec 	= (long)FALSE,
			crbackup	= (long)FALSE,
			conflictres	= (long)1,
			addtomru	= (long)FALSE,
			textcp		= (long)NULL,
			textvlayout	= (long)NULL;

	long		accessmode	= (long)1;
	
	book.SaveAs( filename, fileformat, passw, wrespassw, readonlyrec, crbackup, accessmode, conflictres, addtomru, textcp, textvlayout);
	app.SetVisible(TRUE);

	return TRUE;
}

Die Zeile
AfxMessageBox(fname);
gibt auch sinnigerweise eine Messagebox mit dem korrekten Dateiname aus,
soweit kein Problem. Das Problem ist dann wahrscheinlich erst die Zeile
COleVariant filename = (LPCTSTR)fname
weil dort höchstwahrscheinlich die Konvertierung fehlschlägt. Warum, weiss
ich aber nicht - der Compiler (Visual C++ 6 Pro) meldet weder einen Fehler noch
eine Warnung. Syntaktisch sollte es also stimmen.
Debuggen ist nicht so einfach, weil die aufrufende VB-Anwendung abstürzt, nicht
die DLL. Zumindest aus Sicht von Windows :(
Hat jemand eine Idee? Das ist echt ein Problem, was mich noch bis kurz vor den
Kollaps bringt. Einfach nur unklar.
Komisch ist auch: wenn ich
COleVariant filename = (LPCTSTR)fname
in
COleVariant filename = "x:\\test.xls"
abändere, funktioniert es bestens! Aber der Dateiname soll ja übergeben werden ...

Besten Dank für Eure Hilfe!
 
Hi,

ich hatte mal ein ähnliches Prob, entweder du probierst was bei der übergabe von "x:\test.xls" passiert, oder du machst einen Convert zum Shortpathname mit der funktion GetShortPathNameA

Sag Bescheid ob es dir weiterhilft.

Gruß

Toaster
 
;)

Danke für Deine Hilfe, aber das Problem hat sich inzwischen geklärt. Es lag zum einen an einem falschen Datentyp, und zum anderen an einer falschen Wert - wenn ich jetzt von VB aus "x:\test.xls" (also ohne doppeltes "\") übergebe, funzt alles wunderbar! Geil!
 
Hallo,
von MeLLe hat nicht zufällig jemand die Email Adresse?

Ich habe genau das gleiche Problem der Datentypen, doch finde keine Lösung. Leider hat MeLLe die Lösung der Datentypen nicht beschrieben.

Mein Problem:

Ich will aus VB einen Filename an eine in C++ geschriebene DLL übergeben.

Der Code ist ähnlich wie bei MeLLe. In VB übergebe ich einen String und die DLL erwartet ein "const char*" .
Leider verursacht das in VB einen Fehler 49: Falsche DLL- Aufrufkonvention.

Kann mir jemand helfen?

Vielen Dank

Cu Trucki
 
Zurück
Oben