2

IntraWebは初めてです。ADOコントロールを使用してアクセスデータベースに接続して表示する簡単なアプリケーションを作成したいと思います。サーバーを実行すると、サーバーが表示されます

「CoInitializeは呼び出されていません」

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

IWServerControllerのComInitializationプロパティをciMultiThreadedに変更します。

IWAppFormCreateイベントでこれを実行しようとしました。次に、コンパイルエラーが発生しました:

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

IWServerController.ComInitialization:=ciMultiThreaded;を入力すると、ランタイムエラーが発生します。

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

自分が何をしているのかわからないので、問題を見つけることができません。私を助けてください。

4

3 に答える 3

3

ADOを使用したIntraWebのCoInitializeエラーは、正しい答えを示します。

この質問に対する@Davidの回答に対するコメントからわかるように、2つのことが残っています。

  1. ここで、TComInitializationタイプが宣言されます。これにより、ciMultiThreaded識別子が定義されます。これに対する答えは次のとおりです。IWServerControllerBaseユニット、Intrawebの一部。
  2. これを機能させるために、IWServerControllerオブジェクトのComInitializationプロパティを変更する場所。
    • 最初に知っておく必要があるのは、IWServerControllerオブジェクトの構築に使用される実際のクラスがIntraWebプロジェクトの一部であるということです。
    • 次に、ページのOnCreateイベントでこのプロパティを設定しようとすると遅すぎるように見えます(COMを初期化するスレッドで作成する必要があります)。この時点でこのプロパティを変更することは禁止されており、例外が発生するか、または完全に無視されます。
    • WebアプリケーションウィザードにDelphiXEVCLを使用して、クラスTIWServerControllerを持つServerControllerという名前のユニットを取得しました。コンストラクターのオーバーライドに失敗した後、AfterConstructionメソッドをオーバーライドして、このようなプロパティを初期化します。

例:

  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正常に接続されました

これで十分だといいのですが。

于 2011-03-19T20:10:57.093 に答える
0

COMを初期化していないようです。これは、を呼び出すことによって行う必要がありますCoInitializeEx()。ドキュメントから:

CoInitializeExは、COMライブラリを使用するスレッドごとに、少なくとも1回呼び出す必要があり、通常は1回だけ呼び出されます。同じスレッドによるCoInitializeExへの複数の呼び出しは、同じ同時実行フラグを渡す限り許可されますが、後続の有効な呼び出しはS_FALSEを返します。スレッドでCOMライブラリを正常に閉じるには、S_FALSEを返す呼び出しを含め、CoInitializeまたはCoInitializeExへの呼び出しが成功するたびに、対応するCoUninitializeへの呼び出しとのバランスを取る必要があります。

于 2011-03-19T18:26:00.750 に答える
0

XE2でIntraWebApplicationWizardを使用した場合は、ServerController.pasユニットが作成されます。

ビジュアルデザイナでそのユニットを開き、「フォーム」をクリックすると、TIWServerControllerの多数のプロパティが表示されます。それらの1つはComInitializationです。これは、ciMultiThreaded、ciNone、ciNormalを含むドロップダウンです。デフォルトはciNoneです。

ComInitializationプロパティを変更した後の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

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

于 2012-08-09T05:34:50.443 に答える