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.

È stato utile?

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:

  1. Dove viene dichiarato il tipo di tcominizializzazione, che a sua volta definisce l'identificatore di cimultithread. Risposta a questo è: IwserverControllerbase Unit, parte dell'intraweb.
  2. 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:

TADOConnection Succesfully connected

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top