Cominitialization -Eigenschaft von ServerController
Frage
Ich bin neu in Intraweb. Ich möchte eine einfache Anwendung erstellen, die eine Zugriffsdatenbank mit ADO -Steuerelementen verbindet und anzeigt. Wenn ich den Server ausführe, gibt er mir
"Coinitialize wurde nicht genannt"
Error. Ich suchte im Internet und fand viele Text, die das erzählten
Ändern Sie die Kominitialisierungseigenschaft von IwServerController in CimultitHhread.
Ich habe versucht, dies bei der Event von Iwappformcreate zu tun. Dann bekam ich Kompilierungsfehler:
"Nicht deklarierter Kennung CimultitHhread"
Ich lege die Linie IWServerController.ComInitialization:=ciMultiThreaded;
Dann erscheint der Laufzeitfehler:
"Zugriffsverletzung bei Adresse . . ."
Da ich nicht weiß, was ich tue, kann ich das Problem nicht finden. Bitte hilf mir.
Lösung
Das Fehler bei Intraweb mit ADO misitialisieren Gibt Ihnen die richtige Antwort.
Wie ich von Kommentaren fange @David Antwort In dieser Frage sind noch zwei Dinge übrig:
- Wo wird der Typ des T -Kombialisierungstyps deklariert, der auch die Cimultithread -Kennung definiert. Antwort darauf ist: IWSERVERCONTROLLERBASE -Einheit, Teil von Intraweb.
- Wo kann die Kominitialisierungseigenschaft des IwServerController -Objekts geändert werden, um dies zum Laufen zu bringen.
- Das erste, was Sie wissen müssen, ist, dass die tatsächliche Klasse, mit der das iWServerController -Objekt konstruiert wurde, Teil Ihres Intraweb -Projekts ist.
- Als nächstes sieht es zu spät aus, diese Eigenschaft auf einer Seite aufzubauen. vollständig ignoriert werden.
- Mit dem Delphi XE VCL für den Webanwendungsassistenten habe ich ein Gerät namens ServerController mit dem Klasse TiwServerController erhalten. Nachdem ich den Konstruktor nicht überschrieben habe, überschreibe ich die Afterconstruction -Methode, um solche Eigenschaften wie diese zu initialisieren
Beispiel:
TIWServerController = class(TIWServerControllerBase)
procedure IWServerControllerBaseNewSession(ASession: TIWApplication;
var VMainForm: TIWBaseForm);
private
protected
//constructor Create; override; //failed!!
public
procedure AfterConstruction; override;
end;
//..
procedure TIWServerController.AfterConstruction;
begin
inherited;
ComInitialization := ciMultiThreaded; //succeded
end;
Ich habe dann eine Taste, eine Beschriftung und eine ordnungsgemäß konfigurierte Adoconnection (gegen SQL Server) hinzugefügt und:
procedure TIWForm2.IWButton1Click(Sender: TObject);
begin
try
ADOConnection1.Connected := True;
IWLabel1.Caption := 'Connected';
except
on E:Exception do
IWLabel1.Caption := E.ClassName + ' ' + E.Message;
end;
end;
Das Drücken der Taste erzeugt Folgendes:
Ich hoffe, das reicht Ihnen aus.
Andere Tipps
Es hört sich so an, als hätten Sie COM nicht initialisiert, was Sie durch Anrufe tun müssen CoInitializeEx()
. Aus der Dokumentation:
Coinitializeex muss mindestens einmal aufgerufen werden und wird normalerweise nur einmal für jeden Thread, der die COM -Bibliothek verwendet, genannt. Mehrere Aufrufe bei Coinitializeex durch denselben Thread sind zulässig, solange sie das gleiche Parallelitätsflag übergeben, aber nachfolgende gültige Aufrufe return s_false. Um die COM -Bibliothek anmutig in einem Thread zu schließen, muss jeder erfolgreiche Aufruf zur Coinitialisierung oder Coinitializeex, einschließlich eines Aufrufs, der S_FALSE zurückgibt, durch einen entsprechenden Aufruf zur Beratung ausgeglichen werden.
Wenn Sie den Intraweb -Anwendungsassistenten in XE2 verwendet haben, würde er für Sie eine Servercontroller.pas -Einheit erstellt.
Wenn Sie dieses Gerät im visuellen Designer öffnen und auf das "Form" klicken, sehen Sie eine Reihe von Eigenschaften für den TiwServerController. Eine davon ist die Kominitialisierung, die ein Dropdown mit Cimultithrede, Cinone, Cinormal enthält. Es ist standardmäßig Cinone.
Hier ist das DFM, nachdem ich die Eigenschaft der Kominitialisierung geändert habe:
object IWServerController: TIWServerController
OldCreateOrder = False
AuthBeforeNewSession = False
AppName = 'MyApp'
CharSet = 'UTF-8'
CacheExpiry = 120
ComInitialization = ciMultiThreaded
Compression.Enabled = False
Compression.Level = 6
Description = 'My IntraWeb Application'
DebugHTML = False
DisplayName = 'IntraWeb Application'
Log = loNone
EnableImageToolbar = False
ExceptionDisplayMode = smAlert
HistoryEnabled = False
InternalFilesURL = '/'
JavascriptDebug = False
PageTransitions = False
Port = 8888
RedirectMsgDelay = 0
ServerResizeTimeout = 0
ShowLoadingAnimation = True
SessionTimeout = 10
SSLOptions.NonSSLRequest = nsAccept
SSLOptions.Port = 0
SSLOptions.SSLVersion = sslv3
Version = '12.0.8'
OnNewSession = IWServerControllerBaseNewSession
Height = 310
Width = 342
end
Hoffe das hilft einigen.