AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

2 kleine c++ Fragen

Ein Thema von geskill · begonnen am 8. Feb 2010 · letzter Beitrag vom 9. Feb 2010
Thema geschlossen
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#1

2 kleine c++ Fragen

  Alt 8. Feb 2010, 18:43
Hallo,
da Delphi nicht die einzigste Programmiersprache ist, habe ich mir gedacht, mein Plugin System zu übersetzten. Bevor ich jedoch direkt damit anfange, habe ich mir ein kleines Testprogramm mit kleineren Funktionen geschrieben, welche Widestring's, PWideChar's, Integer's oder ähnliches im Plugin Manipulieren.
Nun bin ich aber dabei auch ganze Klassen dem Plugin zu übergeben.

Aus dieser Basisklasse werden alle weiteren Plugins abgeleitet.
Delphi-Quellcode:
  TPlugIn = class
  //private
    //FErrorMsg: WideString;
  public
    constructor Create; virtual;
    function GetName: PWideChar; virtual; stdcall; abstract;
    function GetParentClassName: PWideChar; virtual; stdcall; abstract;

    //property ErrorMsg: WideString read FErrorMsg write FErrorMsg;
  end;

constructor TPlugIn.Create;
begin
  inherited Create;
end;
Nun folgt mein erster C++ Ansatz:
Frage 1: Ist das so korrekt?
Header Datei
Code:
#pragma once

class TPlugIn
{
public:
   TPlugIn(void);
   // ~TPlugIn(void);
   virtual void _stdcall GetName(LPWSTR* result) = 0;
   virtual void _stdcall GetParentClassName(LPWSTR* result) = 0;
};
Code:
#include "StdAfx.h"
#include "TPlugIn.h"

TPlugIn::TPlugIn(void)
{
}
== == == ==
Das Pluginsystem lädt das PlugIn und erstellt eine Plugin interne abgeleitete Klasse von TPlugIn:
Delphi-Quellcode:
function LoadPlugin(var PlugIn: TPlugIn): Boolean; export;
begin
  try
    PlugIn := TMyPlugIn.Create;
    Result := True;
  except
    Result := False;
  end;
end;
Problem 1: Wie erstellt man eine Klasse die als Referenzparameter übergeben wird?
Code:
bool LoadPlugIn(TPlugIn &PlugIn) // oder mit Sternchen ? - mit ohne alles geht gar nicht
{
   //TMyPlugIn PlugIn; // klappt nicht
        //PlugIn = new TMyPlugIn // klappt auch nicht

   TMyPlugIn cPlugIn; // so vielleicht ?
        PlugIn = cPlugIn;

   return TRUE;
}
Wenn ich das jetzt einfach so starte bekomme ich eine Zugriffsverletzung.
Angehängte Dateien
Dateityp: zip cpp_plugins_for_dummies_170.zip (1,22 MB, 1x aufgerufen)
Sebastian
 
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#2

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 17:26
Wenn ich das Plugin unterm C++ Debugger laufen lasse, kommt dieser in das PlugIn, jedoch erstellt er die abgeleitete Klasse von TPlugIn nicht richtig, sodass im Hauptprogramm danach beim Aufruf von GetName eine AV erscheint. Der boolesche Rückgabewert ist immer entsprechend meiner Angabe.

Ich glaube mit Sternchen also Pointer ist es besser. Bei Klassen wird meine ich sowieso generell die Referenz mitgegeben.
Code:
bool LoadPlugIn(TPlugIn *PlugIn)
Aber trotzdem muss irgendwas noch falsch sein - oder sind Klassen inkompatibel ???

Hier ist die nur im Plugin genutzte von TPlugin abgelittene TMyPlugIn Klasse
Code:
#pragma once
#include "tplugin.h"

class TMyPlugIn :
   public TPlugIn
{
public:
   TMyPlugIn(void);
   //~TMyPlugIn(void);
    virtual void _stdcall GetName(LPWSTR* result);
   virtual void _stdcall GetParentClassName(LPWSTR* result);
};
Code:
LPWSTR ConvertToLPWSTR( const std::string& s )
{
  LPWSTR ws = new wchar_t[s.size()+1]; // +1 for zero at the end
  copy( s.begin(), s.end(), ws );
  ws[s.size()] = 0; // zero at the end
  return ws;
}

TMyPlugIn::TMyPlugIn(void)
{
}
/*
TMyPlugIn::~TMyPlugIn(void)
{
}
*/
void _stdcall TMyPlugIn::GetName(LPWSTR* result)
{
   string s1 = "PluginName";
   *result = ConvertToLPWSTR(s1);
}

void _stdcall TMyPlugIn::GetParentClassName(LPWSTR* result)
{
   string s1 = "TMyPlugIn";
   *result = ConvertToLPWSTR(s1);
}
Sebastian
 
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#3

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 17:55
Code:
void _stdcall TMyPlugIn::GetName(LPWSTR* result)
{
   string s1 = "PluginName";
   // *result = ConvertToLPWSTR(s1);
   // so:
   result = ConvertToLPWSTR(s1);
}

void _stdcall TMyPlugIn::GetParentClassName(LPWSTR* result)
{
   string s1 = "TMyPlugIn";
   // *result = ConvertToLPWSTR(s1);
   // so:
   result = ConvertToLPWSTR(s1);
}
Warum nimmst du jeinen Rückgabewert?
Code:
LPWSTR* _stdcall TMyPlugIn::GetName() {
   return ConvertToLPWSTR("PluginName");
}
[ADD]
Code:
bool LoadPlugIn(TPlugIn *PlugIn)

   TMyPlugIn *PlugIn = new TMyPlugIn;
   return TRUE;
}
 
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#4

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 18:04
Zitat von implementation:
Code:
bool LoadPlugIn(TPlugIn *PlugIn)

   TMyPlugIn *PlugIn = new TMyPlugIn;
   return TRUE;
}
Dann bekomme ich leider diesen Fehler:
Zitat:
Fehler 1 error C2082: Neudefinition des formalen Parameters "PlugIn"

Laut dieser Tabelle (etw. weiter unten) ist ein delphi PWideChar ein c LPWSTR
Sebastian
 
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 18:08
Ähm ja, mein Fehler.
Code:
bool LoadPlugIn(TPlugIn *PlugIn)

   PlugIn = new TMyPlugIn;
   return TRUE;
}
 
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 18:27
Leider leider klappt das auch nicht, wenn ich z.b. nach dem LoadPlugin im Hauptprogramm eine Abfrage mit if Assigned(Plugin) mache bekomme ich ein False, also irgendwie erstellt das Plugin die Klasse nicht oder in einem Format, welches das Hauptprogramm leider nicht lesen kann.
Sebastian
 
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#7

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 18:39
Dann zeig mal den Ausschnitt.
 
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#8

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 18:47
Delphi-Quellcode:
type
  TPlugIn = class
    // private
    // FErrorMsg: WideString;
  public
    constructor Create; virtual;
    function GetName: WideString; virtual; stdcall; abstract; // hatte jetzt beides auf Widestring umgestellt sprich BSTR
    function GetParentClassName: WideString; virtual; stdcall; abstract;

    // property ErrorMsg: WideString read FErrorMsg write FErrorMsg;
  end;
  // PPlugIn = ^TPlugIn;

  TLoadPlugIn = function(var PlugIn: TPlugIn): Boolean;

  // [...]

procedure TForm1.Button5Click(Sender: TObject);
var
  hLib: Cardinal;
  MLoadPlugIn: TLoadPlugIn;
  PlugIn: TPlugIn;
begin
  hLib := LoadLibrary('PluginB.dll');
  try
    if not(hLib = 0) then
    begin
      @MLoadPlugIn := GetProcAddress(hLib, 'LoadPlugIn');
      if not(@MLoadPlugIn = nil) then
      begin
        if MLoadPlugIn(PlugIn) then // das return aus'm plugin true/false kommt richtig an
          try
            if Assigned(PlugIn) then
              ShowMessage(''); // Diese Statusmeldung bekomme ich nie
            if PlugIn.GetParentClassName = 'TPlugInthen // hier knallts
            begin
              ShowMessage(PlugIn.GetName);
            end
            else
              raise Exception.Create('');
          finally
            PlugIn.Free;
          end;
      end
      else
        raise Exception.Create('');
    end;
  finally
    FreeLibrary(hLib);
  end;
end;
Sebastian
 
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: 2 kleine c++ Fragen

  Alt 9. Feb 2010, 18:51
So böse es auch scheinen mag mache ich hier mal zu. Nach über 200 Beiträgen sollte es doch eigentlich bekannt sein das bei uns gilt: Pro Thema nur eine Frage. Und das hat den Vorteil das der Titel auch aussagekräftiger wird so das man erkennen kann worum es in dem Thema geht.
Erstelle also bitte für jede deiner Fragen ein eigenes Thema mit entsprechendem Titel

*** geschlossen ***
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
 
Thema geschlossen


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 12:23 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