用Request.PathTranslated获得的是IIS的物理路径,但如果DLL文件不在IIS所指定的主目录下,而是通过虚拟目录的方法时,就不正确了。如:
-----------------------------------------------------
IIS的主目录是在:C:\WWWRoot\
DLL文件是在:D:\ISAPI\在IIS中建立虚拟目录,指向D:\ISAPI\,这时Request.PathTranslated获得的是C:\WWWRoot\,用Application.Exepath等函数也不能正常获得,请问如何获得该DLL文件的真实路径,即:D:\ISAPI\十万火急!!!

解决方案 »

  1.   

    不行!我用的不是IntraWeb,是ISAIP!
      

  2.   

    看我的,绝对没问题的procedure TAccessData.SoapDataModuleCreate(Sender: TObject);
    var
      dbINI: TIniFile;
      ModuleFileName: array[0..255] of char; // 保存Dll名称
      connectstring, dbuser, dbpassword, dbserver, dbname, path: string;
    begin
      //{取得dll的实际位置}
      GetModuleFileName(GetModuleHandle('PAccessData.dll'), @ModuleFileName[0],
        SizeOf(ModuleFileName));
      path := ExtractFilePath(ModuleFileName) + 'config.dll'; // 取得该目录下ini文件
      dbINI := TIniFile.Create(path); //建立ini文件存取类
      connectstring := '';
      dbuser := dbINI.ReadString('shangbao', 'dbuser', ''); //数据库登录用户
      dbpassword := dbINI.ReadString('shangbao', 'dbpassword', ''); //数据库登录密码
      dbname := dbINI.ReadString('shangbao', 'dbname', ''); //数据库库名
      dbserver := dbINI.ReadString('shangbao', 'dbserver', ''); //数据库实例名称  connectstring := connectstring + 'Provider=SQLOLEDB.1;';
      connectstring := connectstring + 'Persist Security Info=False;';
      connectstring := connectstring + 'User ID=' + dbuser + ';';
      connectstring := connectstring + 'Initial Catalog=' + dbname + ';';
      connectstring := connectstring + 'Data Source=' + dbserver; //连接参数字符串
      ADOConnection1.keepconnection := True;
      ADOConnection1.loginprompt := False;
      ADOConnection1.ConnectionString := connectstring;
      ADOConnection1.Open(dbuser, dbpassword);
      dbINI.Free;
    end;
      

  3.   

    GetModuleFileName(GetModuleHandle('PAccessData.dll'), @ModuleFileName[0],
        SizeOf(ModuleFileName));//我这里的dll是'PAccessData.dll',你写上你的dll名称,不过有个缺点,你的dll名称是定死的,不知道大家怎么解决的?
      

  4.   

    太感谢了!!!这个问题困扰了我很长时间!!!获得 DLL 名称很简单,因为 Request.URL 里面就包含它!用下面的:
    Copy(Request.URL,LastDelimiter('/',Request.URL)+1,Length(Request.URL)-LastDelimiter('/',Request.URL)+1)
    就可以了。我为了省事才这样写,你再分开它吧!
      

  5.   

    你用的不是IntraWeb中的ISAIP application吗?
      

  6.   

    To xiao78(xiao78):不是,是 Web Server Application 的 ISAPI,就是D5带的那个(好象从D4就有了)TO theone_jxm() :
     还有点问题:将生成的DLL文件分别复制到其它盘的两个不同的文件夹下,再将两个文件夹都指定为虚拟目录,在浏览器打开后,两个程序返回的路径相同,浏览器先访问那个DLL,就显示该DLL的路径,另一个也显示该路径,然后再怎么刷新都不管用,除非重启IIS。
      

  7.   

    我创建了一个web application server, 
    加个PageProducer1, 
    procedure TWebModule1.WebModuleCreate(Sender: TObject);
    begin
    PageProducer1.HTMLDoc.CommaText :=
    '<htnl>'
    +'<title>knptn'
    +'</title>'
    +'<body>'
    + '</p>' + gsapppath + '</P>'
    +'</body>'
    +'</html>';
    end;可以看到project.dll 在计算机中的路径. 
    在intraweb中, gsapppath也是用于isapi module
      

  8.   

    xiao78(xiao78):我又试了试,可以用,第一次试的时候不知怎么编译通不过,真是对不起,还是你的方法简便,关键是准确!TO theone_jxm() :用gsapppath吧,没有路径相同的问题,而且简便!感谢二位,一同受分!