Proprietà cominizializzazione di ServerController
Domanda
Sono nuovo in Intraweb. Voglio creare una semplice applicazione che collega e visualizzi un database di accesso utilizzando i controlli ADO. Quando eseguo il server mi dà
"Coinitialize non è stato chiamato"
errore. Ho cercato su Internet e ho trovato molti messaggi che lo dicevano
Cambia la proprietà di cominizializzazione di IwserverController a Cimultithread.
Ho provato a farlo nell'evento IwappFormCreate. Poi ho ricevuto un errore di compilazione:
"Identificatore non dichiarato Cimultithread"
Ho messo la linea IWServerController.ComInitialization:=ciMultiThreaded;
Quindi si presenta l'errore di runtime:
"Violazione d'accesso all'indirizzo . . ."
Dal momento che non so cosa sto facendo, non riesco a trovare il problema. Mi aiuti per favore.
Soluzione
Il Errore di coinizializzazione sull'intracuire usando ADO ti dà la risposta corretta.
Mentre prendo dai commenti su @David Risposta A questa domanda, sono rimaste due cose:
- Dove viene dichiarato il tipo di tcominizializzazione, che a sua volta definisce l'identificatore di cimultithread. Risposta a questo è: IwserverControllerbase Unit, parte dell'intraweb.
- Dove cambiare la proprietà di cominizializzazione dell'oggetto IWServerController per far funzionare questo.
- La prima cosa che devi sapere è la classe effettiva utilizzata per costruire l'oggetto IWServerController fa parte del tuo progetto Intraweb.
- Successivamente, provare a impostare questa proprietà su una pagina su un evento di Create sembra troppo tardi (deve essere creato nel thread che si desidera inizializzare COM), la mia ipotesi è che alterare questa proprietà in questo momento sia vietato e aumenterà un'eccezione o lo farà essere ignorato completamente.
- Usando Delphi XE VCL per la procedura guidata dell'applicazione Web ho ottenuto un'unità denominata ServerController, con la classe TiwserverController. Dopo non essere riuscito a sovrascrivere il costruttore, prevalco il metodo di post -costruzione per inizializzare tale proprietà, come questa
Esempio:
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;
Ho quindi aggiunto un pulsante, un'etichetta e un'adoconnection correttamente configurata (contro SQL Server se questo è importante) e:
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;
Premendo il pulsante, produce questo:
Spero che questo sia abbastanza per te.
Altri suggerimenti
Sembra che tu non abbia inizializzato com, cosa che ti devi fare chiamando CoInitializeEx()
. Dalla documentazione:
Coinitializeex deve essere chiamato almeno una volta, e di solito viene chiamato solo una volta, per ogni thread che utilizza la libreria COM. Chiamate multiple a Coinitializeex con lo stesso thread sono consentite fintanto che superano lo stesso flag di concorrenza, ma le successive chiamate valide restituiscono s_false. Per chiudere la libreria COM con grazia su un thread, ogni chiamata riuscita a coinitializza o coinitializeex, inclusa qualsiasi chiamata che restituisce s_false, deve essere bilanciata da una corrispondente chiamata a containizzazione.
Se hai utilizzato la procedura guidata dell'applicazione IntrawEB in XE2, avrebbe creato un'unità ServerController.Pas per te.
Se apri quell'unità nel Visual Designer e fai clic su "Forma", vedrai una serie di proprietà per il TiwserverController. Uno di questi è la cominizializzazione, che è un calo contenente cimultithread, Cinone, Cinormal. È impostazione predefinita per Cinone.
Ecco il DFM dopo aver cambiato la proprietà di Cominitializzazione:
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
Spero che questo aiuti alcuni.