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.

¿Fue útil?

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:

  1. 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.
  2. 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:

TADOConnection Succesfully connected

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top