C++Builder 2007深入体验之冰火两重天

来源:互联网 发布:罗斯科简单 知乎 编辑:程序博客网 时间:2024/05/01 23:44

早在BCB2007发布之前已经听说该版本的兼容性比较好,这次好好的体验了一把.上次我在 http://blog.csdn.net/lqglaive/archive/2007/06/11/1647850.aspx上提到TMS IntraWeb Component Pack Pro控件无法使用的问题就是通过BCB2007对BCB2006控件的兼容性来解决的,首先下载TMS IntraWeb Component Pack Pro控件的BDS2006 for C++Builer版,然后直按安装,安装后不用编译(编译是通不过的,会说资源重复)直接就可以使用了,而且是已经注册的.这一功能确实是让人爽了一把,但却在使用中又发现了BCB2007的一个Bug,一个真正的Bug.当我使用VCL for the Web建立WEB应用程序时,当使用StandAlone Application模式时完全正常,但当使用ISAPI Extension模式时发现发布后的DLL根本不会工作,经过工程文件的对照发现了蛛丝马迹,下图是StandAlone Application模式的工程文件:

下图是ISAPI Extension模式的工程文件:

经对比就可以发现在ISAPI Extension模式中缺少工程的源文件Project1.cpp对BDS2006中的ISAPI Extension模式工程的工程源文件进行分析发现:

//---------------------------------------------------------------------------
#include <ActiveX.hpp>
#include <ComObj.hpp>
#include <WebBroker.hpp>
#include <ISAPIApp.hpp>
#include <ISAPIThreadPool.hpp>
#include <Isapi2.hpp>
#include <IWInitISAPI.hpp>

#pragma hdrstop

USEFORM("Unit1.cpp", IWForm1); /* TIWAppForm: File Type */
USEFORM("ServerController.cpp", IWServerController); /* TIWServerControllerBase: File Type */
USEFORM("UserSessionUnit.cpp", IWUserSession); /* TIWUserSessionBase: File Type */
//---------------------------------------------------------------------------
#define Application Webbroker::Application

#pragma link "isapiapp.obj"
#pragma link "isapithreadpool.obj"
#pragma link "webbroker.obj"
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
  try {
 switch (reason) {
   case DLL_PROCESS_ATTACH: {
  CoInitFlags = COINIT_MULTITHREADED;
  IWRun();
  break;
   }
 }

  }
  catch (Exception &exception)
  {
  }
  return 1;
}
//---------------------------------------------------------------------------
extern "C"
{
  BOOL __declspec(dllexport) WINAPI GetExtensionVersion(Isapi2::THSE_VERSION_INFO &Ver)
  {
    return Isapithreadpool::GetExtensionVersion(Ver);
  }
  //---------------------------------------------------------------------------
  unsigned __declspec(dllexport) WINAPI HttpExtensionProc(Isapi2::TEXTENSION_CONTROL_BLOCK &ECB)
  {
 return Isapithreadpool::HttpExtensionProc(ECB);
  }
  //---------------------------------------------------------------------------
  BOOL __declspec(dllexport) WINAPI TerminateExtension(int dwFlags)
  {
    return Isapithreadpool::TerminateExtension(dwFlags);
  }
}
//---------------------------------------------------------------------------
#undef Application
//---------------------------------------------------------------------------

正是导出函数GetExtensionVersion、HttpExtensionProc、TerminateExtension决定了DLL在WEB服务器上的工作方式,回过头来再用
eXeScope来分析Project1.dll发现导出函数中正是少了这三个函数,我真的无语!!!!!!在工程中导入上面的Project1.cpp后成功,但对网页模板的支持好象还是有问题,正在进一步研究中。CodeGear说爱你不容易啊!