質問

私はIntraWebに慣れていません。 ADOコントロールを使用してアクセスデータベースを接続および表示する簡単なアプリケーションを作成したいと思います。サーバーを実行すると、それは私に与えてくれます

「Coinitializeは呼ばれていません」

エラー。私はインターネットを検索しましたが、それを伝える多くのテキストを見つけました

iwserverControllerのコミニテル化プロパティをCimultithreadedに変更します。

IWAppformCreateイベントでこれをやろうとしました。その後、コンピレーションエラーが発生しました:

「宣言されていない識別子cimultithreaded」

ラインを置きました IWServerController.ComInitialization:=ciMultiThreaded; その後、ランタイムエラーが発生します。

"アドレスのアクセス違反 。 。 。"

何をしているのかわからないので、問題は見つかりません。私を助けてください。

役に立ちましたか?

解決

ADOを使用して、IntraWebのエラーをcyinitializeします あなたに正解を与えます。

コメントからキャッチすると @Davidの回答 この質問には、残っていることが2つあります。

  1. comultithreaded識別子を定義するtcominitializationタイプが宣言されている場所。これへの回答は次のとおりです。IWSERVERCONTROLLOLLERBASEユニット、IntraWEBの一部。
  2. iwserverControllerオブジェクトのコミニテル化プロパティを変更する場所を取得します。
    • 最初に知っておく必要があるのは、iWserverControllerオブジェクトの構築に使用される実際のクラスは、IntraWEBプロジェクトの一部です。
    • 次に、このプロパティをページOnCreateイベントに設定しようとすると、手遅れに見えます(COMを初期化するスレッドで作成する必要があります)、この時点でこのプロパティを変更することは禁止されており、例外を提起するか、完全に無視されます。
    • WebアプリケーションウィザードにDelphi XE VCLを使用して、クラスTiwserverControllerを使用して、ServerControllerという名前のユニットを入手しました。コンストラクターのオーバーライドに失敗した後、私はこのようなプロパティを初期化するためにアフターコンストラクション方法をオーバーライドします

例:

  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;

次に、ボタン、ラベル、および適切に構成されたAdoConnection(それが重要な場合はSQL Serverに対して)を追加しました。

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;

ボタンを押して、これを生成します:

TADOConnection Succesfully connected

これがあなたに十分であることを願っています。

他のヒント

初期化されたcomを持っていないように聞こえますが、電話をかけて行う必要があります CoInitializeEx(). 。ドキュメントから:

coinitializeexは、少なくとも1回は呼び出され、通常はcomライブラリを使用する各スレッドに対して1回だけ呼ばれます。同じスレッドによるCoinitializeexへの複数の呼び出しは、同じ並行性フラグを渡す限り許可されますが、その後の有効な呼び出しはs_falseを返します。スレッドでCOMライブラリを優雅に閉じるには、S_FALSEを返すコールを含む、COINITIALIZEまたはCOINITIALIZEEXへのコールを成功させるたびに、対応するコールとCounitializeにバランスを取る必要があります。

XE2でIntraWebアプリケーションウィザードを使用した場合、ServerController.pasユニットを作成しました。

Visual Designerでそのユニットを開き、「フォーム」をクリックすると、TiwserverControllerのプロパティが多数表示されます。それらの1つはコミニテル化であり、これはcimultithreaded、cinone、cinormalを含むドロップダウンです。デフォルトはCinoneです。

コミニテル化プロパティを変更した後のDFMは次のとおりです。

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

これがいくつかを助けることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top