ComInitialization propriété de ServerController
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
erreur"CoInitialize n'a pas été appelé"
. 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.
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:
- Où est déclarée type TComInitialization, qui à son tour définit l'identifiant ciMultiThreaded. Réponse est:. Unité IWServerControllerBase, une partie de Intraweb
- 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:
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.