![]() |
Übersetzen eines C++ Codeschnipsels nach Delphi
Ich bräuchte mal eure Hilfe beim Übersetzen eines C++ Codeschnipsels nach Delphi. Eigentlich habe ich die Funktion schon übersetzt, allerdings bin ich mir nicht sicher ob das alles so richtig ist was ich da gemacht habe. Vor allem in der Zeile mit CreateInstance bin ich mir unsicher. Ausserdem erhalte ich beim Versuch zu Kompilieren zwei Fehlermeldungen vom Compiler (stehen im übersetzten Delphi-Code).
Orginaler C++ Quellcode:
Code:
Übersetzter Delphi Quellcode:
class ATL_NO_VTABLE CConnect :
. . . // Implementation protected: // IDTFileSystem STDMETHOD(GetFileSystemSites) (SAFEARRAY** ppFileSystemSites); // Attribute protected: // Site SC11::IDTFileSystemSitePtr m_pFileSystemSite; // Site }; // Dateisysteme abfragen STDMETHODIMP CConnect::GetFileSystemSites(SAFEARRAY** ppFileSystemSites) { // Site muss erst erstellt werden if (NULL == m_pFileSystemSite) { // Site erstellen CComObject<CFileSystemSite>* pFileSystemSite; if (SUCCEEDED(CComObject<CFileSystemSite>::CreateInstance(&pFileSystemSite))) { // Site initialisieren pFileSystemSite->Initialize(m_pApplication, m_pAddInSettings); // Site initialisieren pFileSystemSite->QueryInterface(__uuidof(SC11::IDTFileSystemSite), (void**) &m_pFileSystemSite); } } // Site konnte nicht erstellt werden if (NULL == m_pFileSystemSite) return E_OUTOFMEMORY; // Grenzen fuer SafeArray SAFEARRAYBOUND rgsabound; rgsabound.lLbound = 0; rgsabound.cElements = 1; // SafeArray erstellen *ppFileSystemSites = SafeArrayCreate(VT_UNKNOWN, 1, &rgsabound); if (NULL == *ppFileSystemSites) return E_OUTOFMEMORY; // Zugriff auf das Array IUnknown** pItems = NULL; SafeArrayAccessData(*ppFileSystemSites, (void**) &pItems); // Interface abfragen m_pFileSystemSite->QueryInterface(__uuidof(SC11::IDTFileSystemSite), (void**) &pItems[0]); // Zugriff auf Array freigeben SafeArrayUnaccessData(*ppFileSystemSites); // Ans kloar return S_OK; }
Delphi-Quellcode:
[edit=SirThornberry]code-tags durch c-tags ersetzt - Mfg, SirThornberry[/edit]
type
TConnect = class(...) protected // Site m_pFileSystemSite : IDTFileSystemSite; { Protected declarations } // IDTFileSystem function GetFileSystemSites(out ppFileSystemSites: PSafeArray): HResult; stdcall; end; // Dateisysteme abfragen function TConnect.GetFileSystemSites(out ppFileSystemSites: PSafeArray): HResult; var pFileSystemSite : IInterface; rgsabound : SAFEARRAYBOUND; pItems : IUnknown; begin Result := S_OK; // Site muss erst erstellt werden if m_pFileSystemSite = nil then begin pFileSystemSite := CreateComObject(IDTFileSystemSite); if pFileSystemSite <> nil then begin pFileSystemSite.QueryInterface(IDTFileSystemSite, m_pFileSystemSite); end; end; // Site konnte nicht erstellt werden if m_pFileSystemSite = nil then begin Result := E_OUTOFMEMORY; end; // Grenzen fuer SafeArray rgsabound.lLbound := 0; rgsabound.cElements := 1; // SafeArray erstellen ppFileSystemSites := SafeArrayCreate(VT_UNKNOWN, 1, rgsabound); if ppFileSystemSites = nil then begin Result := E_OUTOFMEMORY; end; // Zugriff auf das Array pItems := nil; // [DCC Fehler] Connect.pas(204): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen SafeArrayAccessData(ppFileSystemSites, pItems); // Interface abfragen // [DCC Fehler] Connect.pas(207): E2149 Klasse besitzt keine Standardeigenschaft m_pFileSystemSite.QueryInterface(IDTFileSystemSite, pItems[0]); // Zugriff auf Array freigeben SafeArrayUnaccessData(ppFileSystemSites); end; |
Re: Übersetzen eines C++ Codeschnipsels nach Delphi
Hi,
auf den ersten Blick würde ich behaupten, in Zeile 52 deines Delphi-Codes gehört ein [0] nach pItems. Gruß |
Re: Übersetzen eines C++ Codeschnipsels nach Delphi
Habe ich grade ausprobiert. Dann erhalte ich auch hier die Meldung "E2149 Klasse besitzt keine Standardeigenschaft". Wenn ich in beiden Fällen die "[0]" entferne bleibt nur noch die Meldung "E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen". Allerdings muss die "[0]" an dieser Stelle im C-Quellcode ja auch eine Bedeutung haben. :gruebel:
|
Re: Übersetzen eines C++ Codeschnipsels nach Delphi
Also das in Zeile 56 (Delphi) muss wohl nur pItems heißen.
Ein Array in C ist nur ein Zeiger, mit [x] dahinter werden x Elemente "draufgezählt" und dann gleich dereferenziert. Das & in C entspricht (an dieser Stelle) dem @ in Delphi und liefert wieder den Zeiger. Also ist pItems gleich &pItems[0]! In Zeile 49 (C) steht &pItems, das ist die Adresse der Zeigervariable also ein Zeiger auf nen Zeiger! Da musst du in Delphi @pItems schreiben. Evtl brauchst du noch ein paar Casts in Pointer (TPointer?). |
Re: Übersetzen eines C++ Codeschnipsels nach Delphi
@SnuffMaster23:
Ok, das scheint schon mal zu funktionieren. :thumb: Jedenfalls kann ich jetzt kompilieren. Allerdings stürzt die Fremdanwendung beim Aufruf meines Addins sofort ab. Ich vermute mal das ich bei der Übersetzung der Zeilen 20-32 im C-Quellcode (Zeilen 23-31 im Delphi Quellcode) einen oder mehrere Fehler gemacht habe. :gruebel: Siehst du da vielleicht auch etwas was ich falsch gemacht habe? |
Re: Übersetzen eines C++ Codeschnipsels nach Delphi
Sorry, beim Einfügen des C-Codes ist irgendwie ein bisschen was abhanden gekommen. Habe meinen ersten Beitrag entsprechend editiert. Vielleicht kann jetzt jemand meine Übersetzung nachvollziehen und mich auf evtl. Fehler hinweisen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz