AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Übersetzen eines C++ Codeschnipsels nach Delphi
Thema durchsuchen
Ansicht
Themen-Optionen

Übersetzen eines C++ Codeschnipsels nach Delphi

Ein Thema von ringli · begonnen am 4. Dez 2007 · letzter Beitrag vom 5. Dez 2007
Antwort Antwort
ringli

Registriert seit: 7. Okt 2004
508 Beiträge
 
Delphi 11 Alexandria
 
#1

Übersetzen eines C++ Codeschnipsels nach Delphi

  Alt 4. Dez 2007, 14:45
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:
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;
}
Übersetzter Delphi Quellcode:
Delphi-Quellcode:
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;
[edit=SirThornberry]code-tags durch c-tags ersetzt - Mfg, SirThornberry[/edit]
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Übersetzen eines C++ Codeschnipsels nach Delphi

  Alt 4. Dez 2007, 15:10
Hi,
auf den ersten Blick würde ich behaupten, in Zeile 52 deines Delphi-Codes gehört ein [0] nach pItems.

Gruß
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
508 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Übersetzen eines C++ Codeschnipsels nach Delphi

  Alt 4. Dez 2007, 15:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23

Registriert seit: 13. Feb 2006
Ort: Kempten
253 Beiträge
 
#4

Re: Übersetzen eines C++ Codeschnipsels nach Delphi

  Alt 4. Dez 2007, 15:34
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?).
"Conspiracy is the poor man's mapping of the world" - Fredric Jameson
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
508 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Übersetzen eines C++ Codeschnipsels nach Delphi

  Alt 4. Dez 2007, 15:59
@SnuffMaster23:

Ok, das scheint schon mal zu funktionieren.

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.

Siehst du da vielleicht auch etwas was ich falsch gemacht habe?
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
508 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Übersetzen eines C++ Codeschnipsels nach Delphi

  Alt 5. Dez 2007, 13:30
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz