ServerControllerのコミニテル化プロパティ
質問
私はIntraWebに慣れていません。 ADOコントロールを使用してアクセスデータベースを接続および表示する簡単なアプリケーションを作成したいと思います。サーバーを実行すると、それは私に与えてくれます
「Coinitializeは呼ばれていません」
エラー。私はインターネットを検索しましたが、それを伝える多くのテキストを見つけました
iwserverControllerのコミニテル化プロパティをCimultithreadedに変更します。
IWAppformCreateイベントでこれをやろうとしました。その後、コンピレーションエラーが発生しました:
「宣言されていない識別子cimultithreaded」
ラインを置きました IWServerController.ComInitialization:=ciMultiThreaded;
その後、ランタイムエラーが発生します。
"アドレスのアクセス違反 。 。 。"
何をしているのかわからないので、問題は見つかりません。私を助けてください。
解決
ADOを使用して、IntraWebのエラーをcyinitializeします あなたに正解を与えます。
コメントからキャッチすると @Davidの回答 この質問には、残っていることが2つあります。
- comultithreaded識別子を定義するtcominitializationタイプが宣言されている場所。これへの回答は次のとおりです。IWSERVERCONTROLLOLLERBASEユニット、IntraWEBの一部。
- 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;
ボタンを押して、これを生成します:
これがあなたに十分であることを願っています。
他のヒント
初期化された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
これがいくつかを助けることを願っています。