delphi在window10下用uniGUI開發isapi的調試方法

好久沒有用delphi了,有個老同事還在持續使用新的Delphi,用到10.3版本了。他說我原來寫的Acroprise Multi-Language Suite多語言元件,在用uniGUI元件開發web程序時,standalone下32bit和64bit都沒有問題,在isapi下32bit沒問題,但是64bit有報錯,web界面出不來。

我準備了開發環境:windows 10,delphi 10.3,uniGUI 1.90。

standalone下,AcroMulti在32bit和64bit確實沒問題。

又複習了一遍如何把isapi部署到IIS中,windows 10預裝IIS是10.0版本。發現項目編譯在32bit下AcroMulti能正常跑,但是在64bit下,確實畫面出不來。

如何Debug呢,找來找去,有說用inetinfo.exe,有說用w3wp.exe,都沒成功。後來還是在stackoverflow網站找到這個鏈接:http://paul.klink.id.au/Software/Delphi/DebuggingIsapiWithIisExpress/

具體說一下步驟:

(1)把C:\Program Files\IIS Express\AppServer下的applicationhost.config文件複製到我的項目dll下,如:D:\wxh\AcroMultiLang\Sample\uniGUI\Win64\Debug

(2)修改applicationhost.config文件:

  • 在<system.applicationHost>之<applicationPools>節點下新增一個節點:
<add name="IsapiDebugAppPool" 
autoStart="true" 
enable32BitAppOnWin64="true" 
managedRuntimeVersion="" 
managedPipelineMode="Integrated" />
  • 在<sites>之<site>節點下新增一個節點:
<application path="/D64" applicationPool="IsapiDebugAppPool">
    <virtualDirectory path="/" 
     physicalPath="D:\wxh\AcroMultiLang\Sample\uniGUI\Win64\Debug" />
</application>
  • 修改<handlers>節點爲<handlers accessPolicy="Read, Execute, Script">

設置delphi項目的run - parameters...,host application填:C:\Program Files\IIS Express\iisexpress.exe,parameters填:/config:D:\wxh\AcroMultiLang\Sample\uniGUI\Win64\Debug\applicationhost.config

ok,在Delphi下就可以調試了。

調試結果,發現是acroMultiResource.pas中有個地方計算pointer地址時,用的Integer強制轉換,改爲UInt64就好了。

另外,爲了適應後端的每個session的語言不同,在acroMultiLib.pas中增加函數:procedure MultiHook(AProc:TGetDDAndLCIDProc);用於根據session語言動態的給不同的LCID,如:

procedure MultiDD_GetDDAndLCID(out ADDName:string;out ALCID:string);
begin
  ADDName:=DM_DD.acroMultiStreamDD1.DDName;
  if (uniGUIApplication.UniSession<>nil) and 
     (uniGUIApplication.UniSession.UniMainModule<>nil) then
  begin
    //返回當前Session的LCID
    ALCID:=TUniMainModule(uniGUIApplication.UniSession.UniMainModule).LCID;
  end
  else
  begin
    //沒有Session,用服務器的LCID或者英文
    ALCID:='1028';
  end;
end;

procedure TDM_DD.DataModuleCreate(Sender: TObject);
begin
  acroMultiLib.MultiHook(MultiDD_GetDDAndLCID);
end;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章