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:
Dazu hier der Code der aufgerufenen DLL-Funktion:
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!
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!