📄 websnap.txt
字号:
另外,在前一个方式下,提交数据,虽然报告错误但是数据实际被修改了;而后一种方式下,根本修改不了数据,且出现这样的错误信息:
Permission denied. File: C:\WINNT\system32\Tra10.MB Table: C:\WINNT\system32\Tra10.MB File or directory does not exist. File: C:\WINNT\system32\Tra10.DB
请教各位高手!谢谢!
Did you put the files inside the folder Delphi6\Source\WebMidas\ {err.html, xmldb.js, xmldisp.js, xmldom.js, xmlerrdisp.js, xmlshow.js} into the folder where your application located?
寫了個測試程式, 在WebApp Debugger下可是正常執行, 可是轉成ISAPI後無法執行..
我的作法是這樣子的..
開一個新的Project, 選WebSnap Application,
把寫成WebApp Debugger的程式用到的所有Unit加入該project(不含console),
然後build成.dll, 可順利產生.dll
然後放到IIS 5下的一個虛擬目錄..
權限設定沒問題..
然後下http://localhost/mypath/my.dll
就看到ie下面的status bar一直在動作, 表示他正在做某些事,
可是一直都沒有結果出來.
我有參考deploy.txt的方式
註冊
tregsvr WebBrokerScript.tlb
tregsvr stdvcl40.dll
可是情況一樣..
我的環境:
Windows 2000, IIS 5.0
Delphi 6 Ent + Update 2
能否請有經驗的人指點一下是哪個步驗錯了..
謝謝..
自己回一下:
因為碰到上面說的問題..
所以我就到處試..
原先是用 ISAPI + ACCESS (Connection DB Driver用Microsoft Jet 4.0 OLE DB Provider), 然後執行.dll的時候就看到ie的地球一直轉, 沒任何反應..
再來用 ISAPI + ACCESS (Connection DB Driver用Microsoft OLE DB Provider for ODBC), 然後執行.dll, 回應
Internal Server Error 500
Exception: EStackOverflow
Message: Stack overflow
(雖然還是沒用, 不過至少有錯誤訊息了..)
不甘心, 繼續試..
用 ISAPI + MS SQL Server(MSDE) (Connection DB Driver用Microsoft OLE DB Provider for SQL Server), 然後...
實在是太神奇了..
竟然就沒問題了..
程式部份都沒改到,
只有Database部份修正一下..
所以我的問題解決了..
給大家參考一下..
不過..
有沒有人可以說明一下為什麼會有這個問題?
還是我自己架構弄的有問題?
--------------------------------------------------------------------------------
>使用 WebSnap 可以透過 Com 呼叫 delphi 的程式(application)嗎?
>我測試的的結果...會有error..無法將該 exe 叫起來...
在ISAPI 情況下,你必須使用DCOMCNFG.EXE 設定
IUSR_<電腦名稱> 這個使用者的權限,賦與他喚起某個
COM Server 的權限.
--------------------------------------------------------------------------------
>用WebSnap做东西,开一个WebSnap Data Module,把所有数据库元件放里面,没问题。
>
>现在把数据库元件放到应用程序服务器里,在WebSnap Data Module里用TDOMConnection去连接它。却发现奇怪的现象。连接有时候成功,有时候不成功。我是在同一台机器里运行应用程序服务器和Web Debug程序的。
這是在WebAppDebuger 之中才會發生的問題,
轉成ISAPI/Apache Shared Module 後就不會發生了.
問題發生的原因是WebAppDebuger 的處理模式與ISAPI/Apache 的方式不一樣,
WebAppDebuger 的處理模式需要我們自行處理COM Marshall 的動作,
這個動作可以利用GIT (Global Interface Table) 來完成,
只是與其自行處理COM Marshall 這個麻煩的動作,還不如加個Compiler 指令,
在OnActivate與OnDeactivate 事件中開關DCOMConnection 來避開這個問題,
反正最後的程式是不可能使用WebAppDebuger 做為Server 的.
look like this:
OnActivate
{$IFDEF WAD}
DCOMConnection1.Connected:=True;
{$ENDIF}
OnDeActivate
{$IFDEF WAD}
DCOMConnection1.Connected:=False;
{$ENDIF}
--
just coding....
just home:http://home.pchome.com.tw/guide/code6421
谢谢CODE6421兄,我测试的情况果然如此。如果不在OnDeactivate里写DCOMConnection.Connected:=False,第二次浏览同一个页面的时候一定会出错。而且错误还很怪,是“当前的OS版本不正确”。
根据我的观察,WebDataModule是catche的,但浏览完后和服务器的DCOMConnection连接自动端开了。这种情形下,如何做到保持连接,也就是连接Pooling?
如果執意在WebAppDebuger 實現Keeping Connection 這個動作的話,
可以使用GIT(Global Interface Table) 來完成,
簡單的說就是在.dpr 裡建立一個DCOMConnection,並開啟連接,
將IAppServer 這個Interface 放到GIT 中,
當WebDataModule 上的DCOMConnection 需要連接時,由GIT 取出這
個Interface 指定給位於WebDataModule 中的DCOMConnection,這樣
就可以完成了.
在這些動作中,位於dpr 中的DCOMConnection 是一直處於連接狀態的,
而位於WebDataModule 中的DCOMConnection 則只有Connected 屬性是True,
事實上內部的IAppServer 是指向位於dpr 中的DCOMConnnection 內的IAppServer.
PS:這個技巧所做出來的程式可以運作於WebAppDebuger,Apache,IIS,但事實上,
除了WebAppDebuger 之外,Apache,IIS 在不使用這個技巧狀況下都可正常的運作.
code6421兄,真高人啊!我这段时间在学习WebSnap,以后还要多请教您。再次谢谢您的帮助。
--------------------------------------------------------------------------------
>用WebSnap做了一个测试程式,数据库通过DCOMConnection连接应用程序服务器的方式。
>
>在应用程序服务器端,模仿了delphi/demo/midas下的SharedConnection那个例子,做了几个TRemoteDataModule,通过一个主RemoteDataModule输出给客户端。
>
>在WebSnap中,使用了一个WebDataModule放置一个DCOMConnection来连接应用程序服务器。然后分别用几个WebDataModule里放SharedConnection来对应应用程序服务器里的不同的RemoteDataModule。所有这些SharedConnection都通过同一个DCOMConnection来连接服务器。
>
>这样的结构在Debug方式下没问题。
>
>然后我把它做成Apache的DSO,在APACHE下,出现错误提示:
>
>---------------------------------------
>Exception: EOleSysError
>Message: 尚未调用 CoInitialize
>---------------------------------------
>
>请教Code6421兄,这是怎么回事,该如何处理?
加入初始化COM 的呼叫即可.
CoInitialize(Nil);
Application.Initialize;
.............
Application.Run;
CoUnInitialize;
※ 引述《pcplayer》於 05/30/2002 21:25:46 發表之銘言:
>谢谢Code6421兄,我这就马上试一下。
>
>对了,在IIS下的错误提示是这样的:
>--------------
>Exception: EOleException
>Message: 应用程序调用一个已为另一线程整理的界面。
>----------------------
code6421兄,我在ISAPI里加上CoInitialize(Nil);和CoUnInitialize;,结果还是出现上面的那个错误提示。请问这是什么原因?
我在Apache shared Module里也加上这个:
CoInitialize(Nil);
Application.Initialize;
Application.Run;
CoUnInitialize;
结果还是在IE上出提示:Exception: EOleSysError
Message: 尚未调用 CoInitialize。
※ 引述《pcplayer》於 05/30/2002 22:36:56 發表之銘言:
>我在Apache shared Module里也加上这个:
>
>CoInitialize(Nil);
>
>Application.Initialize;
>Application.Run;
>
>CoUnInitialize;
>
>结果还是在IE上出提示:Exception: EOleSysError
>Message: 尚未调用 CoInitialize。
呵...真不曉得是我記憶力變差了,還是末日危城玩過頭了,下面這個
程式才是正確的 :)
PS:必須在DCOMConnection 所在的DataModule 中初始COM.
unit uConnComp;
interface
uses
Windows, Messages, SysUtils, Classes, HTTPApp, WebModu, DB, DBClient,
MConnect,ActiveX;
type
TWebDataModule2 = class(TWebDataModule)
DCOMConnection1: TDCOMConnection;
procedure WebDataModuleCreate(Sender: TObject);
procedure WebDataModuleDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function WebDataModule2: TWebDataModule2;
implementation
{$R *.dfm}
uses WebReq, WebCntxt, WebFact, Variants;
function WebDataModule2: TWebDataModule2;
begin
Result := TWebDataModule2(WebContext.FindModuleClass(TWebDataModule2));
end;
procedure TWebDataModule2.WebDataModuleCreate(Sender: TObject);
begin
{$IFDEF APACHE}
CoInitialize(Nil);
{$ENDIF}
end;
procedure TWebDataModule2.WebDataModuleDestroy(Sender: TObject);
begin
{$IFDEF APACHE}
CoUnInitialize;
{$ENDIF}
end;
initialization
if WebRequestHandler <> nil then
WebRequestHandler.AddWebModuleFactory(TWebDataModuleFactory.Create(TWebDataModule2, crAlways, caCache));
end.
--
just coding....
just home:http://home.pchome.com.tw/guide/code6421
Edited by - code6421 on 05/30/2002 23:01:40
※ 引述《pcplayer》於 05/30/2002 21:25:46 發表之銘言:
>谢谢Code6421兄,我这就马上试一下。
>
>对了,在IIS下的错误提示是这样的:
>--------------
>Exception: EOleException
>Message: 应用程序调用一个已为另一线程整理的界面。
>----------------------
IIS 中不需要初始化COM,因為DELPHI 預設會幫你初始並進入Multi-Thread 模式.
--
just coding....
just home:http://home.pchome.com.tw/guide/code6421
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -