Question

Je suis nouveau à IntraWeb. Je veux faire une simple application qui se connecte et affiche une base de données d'accès en utilisant les contrôles ADO. Lorsque j'exécute le serveur, il me donne

"CoInitialize n'a pas été appelé"

erreur

. Je cherchai Internet et a trouvé beaucoup de texte disant que

propriété

Changement de ComInitialization IWServerController à ciMultiThreaded.

J'ai essayé de le faire en cas IWAppFormCreate. Puis je suis arrivé erreur de compilation:

"Identifier ciMultiThreaded Présence non déclarée"

Je mis la IWServerController.ComInitialization:=ciMultiThreaded; ligne alors l'erreur d'exécution apparaît:

"Violation d'accès à l'adresse..."

Depuis que je ne sais pas ce que je fais, je ne peux pas trouver le problème. S'il vous plaît aidez-moi.

Était-ce utile?

La solution

Le erreur CoInitialize sur IntraWeb en utilisant ADO vous donne la bonne réponse.

Comme je l'ai prise des commentaires sur répondre à @ David cette question, il y a deux choses à gauche:

  1. Où est déclarée type TComInitialization, qui à son tour définit l'identifiant ciMultiThreaded. Réponse est:. Unité IWServerControllerBase, une partie de Intraweb
  2. Où changer la propriété ComInitialization de l'objet IWServerController pour obtenir ce travail.
    • La première chose que vous devez savoir est la classe réelle utilisée pour construire l'objet IWServerController fait partie de votre projet IntraWeb.
    • Ensuite, essayer de définir cette propriété sur une page événement OnCreate ressemble trop tard (il doit être créé dans le fil que vous souhaitez initialize COM), je suppose que la modification de cette propriété à ce moment est interdite et déclenche une exception ou sera complètement ignoré.
    • Utilisation de la VCL Delphi XE pour l'assistant d'application Web, je suis une unité nommée ServerController, avec le TIWServerController de classe. Après avoir échoué à passer outre le constructeur, je remplacer la méthode AfterConstruction pour initialiser cette propriété, comme celui-ci

Exemple:

  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;

Je puis ajouté un bouton, une étiquette et ADOConnection correctement configuré (contre SQL Server si cette matière) et:

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;

Frapper le bouton, produit ceci:

TADOConnection connecté avec succès se

Espérons que cela est suffisant pour vous.

Autres conseils

On dirait que vous ne l'avez pas initialisé COM, que vous devez faire en appelant CoInitializeEx() . De la documentation:

CoInitializeEx doit être appelé au moins une fois, et est généralement appelé une seule fois, pour chaque thread qui utilise le COM bibliothèque. Plusieurs appels à CoInitializeEx par le même fil sont a permis aussi longtemps qu'ils passent le même drapeau concurrency, mais après valide appels retour S_FALSE. Pour fermer le COM bibliothèque grâce à un fil, chaque appel réussi à CoInitialize ou CoInitializeEx, y compris un appel que le rendement S_False, doit être équilibré par un appel correspondant à CoUninitialize.

Si vous utilisez l'Assistant Application IntraWeb dans XE2, il serait de créer une unité de ServerController.pas pour vous.

Si vous ouvrez cette unité dans le concepteur visuel, et cliquez sur le « formulaire », vous verrez un grand nombre de propriétés du TIWServerController. L'un d'entre eux est ComInitialization, qui est un menu déroulant contenant ciMultiThreaded, ciNone, ciNormal. Il par défaut ciNone.

Voici le DFM après avoir changé la propriété ComInitialization:

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

Espérons que cela aide certains.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top