![]() |
2 kleine c++ Fragen
Liste der Anhänge anzeigen (Anzahl: 1)
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:
Nun folgt mein erster C++ Ansatz:
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; 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:
Problem 1: Wie erstellt man eine Klasse die als Referenzparameter übergeben wird?
function LoadPlugin(var PlugIn: TPlugIn): Boolean; export;
begin try PlugIn := TMyPlugIn.Create; Result := True; except Result := False; end; end;
Code:
Wenn ich das jetzt einfach so starte bekomme ich eine Zugriffsverletzung.
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; } |
Re: 2 kleine c++ Fragen
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:
Aber trotzdem muss irgendwas noch falsch sein - oder sind Klassen inkompatibel ???
bool LoadPlugIn(TPlugIn *PlugIn)
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); } |
Re: 2 kleine c++ Fragen
Code:
Warum nimmst du jeinen Rückgabewert?
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); }
Code:
[ADD]
LPWSTR* _stdcall TMyPlugIn::GetName() {
return ConvertToLPWSTR("PluginName"); }
Code:
bool LoadPlugIn(TPlugIn *PlugIn)
{ TMyPlugIn *PlugIn = new TMyPlugIn; return TRUE; } |
Re: 2 kleine c++ Fragen
Zitat:
Zitat:
Laut dieser ![]() |
Re: 2 kleine c++ Fragen
Ähm ja, mein Fehler.
Code:
bool LoadPlugIn(TPlugIn *PlugIn)
{ PlugIn = new TMyPlugIn; return TRUE; } |
Re: 2 kleine c++ Fragen
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.
|
Re: 2 kleine c++ Fragen
Dann zeig mal den Ausschnitt.
|
Re: 2 kleine c++ Fragen
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 = 'TPlugIn' then // 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; |
Re: 2 kleine c++ Fragen
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 *** |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 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