Propiedad de cominicia de serverController
Pregunta
Soy nuevo en Intraweb. Quiero hacer una aplicación simple que conecta y muestra una base de datos de acceso utilizando controles ADO. Cuando ejecuto el servidor me da
"No se ha llamado coinitialize"
error. Busqué en Internet y encontré muchos mensajes de texto diciendo que
Cambiar la propiedad de cominicia de iWServerController a Cimultithreaded.
Traté de hacer esto en el evento iwappformcreate. Luego recibí un error de compilación:
"Identificador no declarado Cimultithreaded"
Puse la línea IWServerController.ComInitialization:=ciMultiThreaded;
Entonces surge el error de tiempo de ejecución:
"Violación de acceso en la dirección . . ."
Como no sé lo que estoy haciendo, no puedo encontrar el problema. Por favor, ayúdame.
Solución
los Coinicializar el error en Intraweb usando ADO te da la respuesta correcta.
Mientras capto de los comentarios sobre @David Respuesta A esta pregunta, quedan dos cosas:
- Donde se declara el tipo TCominitialization, que a su vez define el identificador Cimultithreaded. La respuesta a esto es: la unidad IWServerControllerBase, parte de Intraweb.
- Dónde cambiar la propiedad de cominicialización del objeto IWServerController para que esto funcione.
- Lo primero que debe saber es que la clase real utilizada para construir el objeto IWServerController es parte de su proyecto Intraweb.
- A continuación, intentando establecer esta propiedad en una página en el evento OnCreate se ve demasiado tarde (debe crearse en el hilo que desea inicializar la com), supongo que alterar esta propiedad en este momento está prohibido y aumentará una excepción, o Will Will ser ignorado por completo.
- Usando el Delphi XE VCL para el Asistente de aplicaciones web, obtuve una unidad llamada ServerController, con la clase TIWServerController. Después de no anular el constructor, anulo el método de construcción posterior para inicializar dicha propiedad, como esta
Ejemplo:
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;
Luego agregué un botón, una etiqueta y una adoconnection configurada correctamente (contra SQL Server si eso importa) y:
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;
Presionar el botón, produce esto:
Espero que esto sea suficiente para ti.
Otros consejos
Parece que no has inicializado com, lo que debes hacer llamando CoInitializeEx()
. De la documentación:
CoinitializeEx debe llamarse al menos una vez, y generalmente se llama solo una vez, para cada hilo que usa la biblioteca COM. Se permiten múltiples llamadas a CoinitializeEx por el mismo hilo siempre que pasen el mismo indicador de concurrencia, pero las llamadas válidas posteriores return s_false. Para cerrar la biblioteca COM con gracia en un hilo, cada llamada exitosa para coinicializar o coinicializeEx, incluida cualquier llamada que devuelva s_false, debe equilibrarse con una llamada correspondiente a Couninialize.
Si utilizara el Asistente de la aplicación Intraweb en XE2, crearía una unidad ServerController.pas para usted.
Si abre esa unidad en el diseñador visual y hace clic en el "formulario", verá una serie de propiedades para el TiwserverController. Uno de ellos es la cominicialización, que es un menú desplegable que contiene Cimultithreaded, Cinone, Cinormal. El valor predeterminado es a Cinone.
Aquí está el DFM después de que cambié la propiedad de cominicialización:
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
Espero que esto ayude a algunos.