自动建立IIS虚拟目录问题 ( 积分: 50 )

  • 主题发起人 主题发起人 hhycqrm
  • 开始时间 开始时间
H

hhycqrm

Unregistered / Unconfirmed
GUEST, unregistred user!
有谁知道用delphi代码怎么建立IIS虚拟目录..
请各位高手指教一下.
 
有谁知道用delphi代码怎么建立IIS虚拟目录..
请各位高手指教一下.
 
用adsi的好做

我也在研究 可我要在嵌入式window nt 下只支持
ABO ,以一的代码可以建立虚拟目录
(但不知为什么建立起 asp 应用)


// Precompiled headers: Not Using Precompiled Headers
// (otherwise causes a C1010 error)
// Preprocessor Definitions: include UNICODE
// (otherwise causes multiple C2664 errors)

#define STRICT
#define UNICODE
#define INITGUID
#define WINVER 0x0400
#define _WIN32_DCOM

#include <WINDOWS.H>
#include <OLE2.H>
#include <winerror.h>
#include <stdio.h>
#include <stdlib.h>
#include <initguid.h>

#include "iadmw.h"
#include "iiscnfg.h"

// Just #define the data and paths to simplify the sample.
// Note that all vroots of a new server must go under the root
// node of the virtual server. In the following statements,
// the virtual server (1) is "/lm/w3svc/1". The new vroot
// will go underneath "/lm/w3svc/1/root"
// Also note that these strings are UNICODE
#define NEW_VROOT_PATH TEXT("MyWebServer")
#define NEW_VROOT_PARENT TEXT("/lm/w3svc/1/root")
#define NEW_VROOT_FULLPATH TEXT("/lm/w3svc/1/root/MyWebServer")
#define NEW_VROOT_DIRECTORY TEXT("d://Focus600Web")
int main (int argc, char *argv[])
{
IMSAdminBase *pcAdmCom = NULL; // COM interface pointer
HRESULT hresError = 0; // Holds the errors returned by the IMSAdminBase API calls
DWORD dwRefCount; // Holds the refcount of the IMSAdminBase object

DWORD dwResult = 0;

METADATA_HANDLE hmdParentHandle; // This is the handle to the parent object of the new vdir.
METADATA_HANDLE hmdChildHandle; // This is the handle to the parent object of the new vdir.

if (argc < 2)
{
puts ("Usage: Create_vdir <machine name>/n Ex: Create_Vdir adamston1/n/n");
return -1;
}

printf ("You will be adding a new VRoot path in the metabase. /n"
" Machine Name: %s/n"
" Path: %s/n"
" Full Path: %s/%s/n",
argv[1],
NEW_VROOT_PATH,
NEW_VROOT_PARENT,
NEW_VROOT_PATH);

// These are required for creating a COM object.
IClassFactory * pcsfFactory = NULL;
COSERVERINFO csiMachineName;
COSERVERINFO *pcsiParam = NULL;

// Fill the structure for CoGetClassObject.
csiMachineName.pAuthInfo = NULL;
csiMachineName.dwReserved1 = 0;
csiMachineName.dwReserved2 = 0;
pcsiParam = &csiMachineName;



// Allocate memory for the machine name.
csiMachineName.pwszName = (LPWSTR) HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, (strlen (argv[1]) + 1) * sizeof (WCHAR) );
if (csiMachineName.pwszName == NULL)
{
printf ("Error allocating memory for MachineName/n");
return E_OUTOFMEMORY;
}

// Convert Machine Name from ASCII to Unicode.
dwResult = MultiByteToWideChar (
CP_ACP,
0,
argv[1],
strlen (argv[1]) + 1,
csiMachineName.pwszName,
strlen (argv[1]) + 1);

if (dwResult == 0)
{
printf ("Error converting Machine Name to UNICODE/n");
return E_INVALIDARG;
}


// Initialize COM.
hresError = CoInitializeEx(NULL, COINIT_MULTITHREADED);

if (FAILED(hresError))
{
printf ("ERROR: CoInitialize Failed! Error: %d (%#x)/n", hresError, hresError);
return hresError;
}

hresError = CoGetClassObject(GETAdminBaseCLSID(TRUE), CLSCTX_SERVER, pcsiParam,
IID_IClassFactory, (void**) &pcsfFactory);

if (FAILED(hresError))
{

printf ("ERROR: CoGetClassObject Failed! Error: %d (%#x)/n", hresError, hresError);
::Sleep(10000);
return hresError;
}
else
{
hresError = pcsfFactory->CreateInstance(NULL, IID_IMSAdminBase, (void **) &pcAdmCom);
if (FAILED(hresError))
{
printf ("ERROR: CreateInstance Failed! Error: %d (%#x)/n", hresError, hresError);
pcsfFactory->Release();
return hresError;
}
pcsfFactory->Release();
}


/***********************************************/
/* Important Section */

// Open the path to the parent object.
hresError = pcAdmCom->OpenKey (
METADATA_MASTER_ROOT_HANDLE,
NEW_VROOT_PARENT,
METADATA_PERMISSION_WRITE | METADATA_PERMISSION_READ,
1000,
&hmdParentHandle);

if (FAILED(hresError))
{
printf ("ERROR: Could not open the Parent Handle! Error: %d (%#x)/n", hresError, hresError);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

printf ("Path to parent successfully opened/n");


/***********************************/
/* Add the new Key for the VROOT */
hresError = pcAdmCom->AddKey (
hmdParentHandle,
NEW_VROOT_PATH);


if (FAILED(hresError))
{
printf ("ERROR: AddKey Failed! Error: %d (%#x)/n", hresError, hresError);
hresError = pcAdmCom->CloseKey(hmdParentHandle);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

printf ("New Child successfully added/n");

// Close the handle to the parent and open a new one to the child.
// This isn't required, but when the handle is open at the parent, no other
// metabase client can access that part of the tree or subsequent child.
// Open the child key because it is lower in the metabase and doesn't conflict with as many
// other paths.
hresError = pcAdmCom->CloseKey(hmdParentHandle);
if (FAILED(hresError))
{
printf ("ERROR: Could not close the Parent Handle! Error: %d (%#x)/n", hresError, hresError);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

hresError = pcAdmCom->OpenKey (
METADATA_MASTER_ROOT_HANDLE,
NEW_VROOT_FULLPATH,
METADATA_PERMISSION_WRITE | METADATA_PERMISSION_READ,
1000,
&hmdChildHandle);

if (FAILED(hresError))
{
printf ("ERROR: Could not open the Child Handle! Error: %d (%#x)/n", hresError, hresError);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

printf ("Path to child successfully opened/n");

/***********************************/
/* The vroot needs a few properties set at the new path in order */
/* for it to work properly. These properties are MD_VR_PATH, MD_KEY_TYPE */
/* and MD_ACCESSPERM. */

METADATA_RECORD mdrNewVrootData;

// First, add the MD_VR_PATH - this is required to associate the vroot with a specific
// directory on the filesystem
mdrNewVrootData.dwMDIdentifier = MD_VR_PATH;

// The inheritable attribute means that paths that are created underneath this
// path will retain the property from the parent node unless overwritten at the
// new child node.
mdrNewVrootData.dwMDAttributes = METADATA_INHERIT;
mdrNewVrootData.dwMDUserType = ASP_MD_UT_APP;
mdrNewVrootData.dwMDDataType = STRING_METADATA;

// Now, create the string. - UNICODE
mdrNewVrootData.pbMDData = (PBYTE) NEW_VROOT_DIRECTORY;
mdrNewVrootData.dwMDDataLen = (wcslen (NEW_VROOT_DIRECTORY) + 1) * sizeof (WCHAR);
mdrNewVrootData.dwMDDataTag = 0; // datatag is a reserved field.


// Now, set the property at the new path in the metabase.
hresError = pcAdmCom->SetData (
hmdChildHandle,
TEXT ("/"),
&mdrNewVrootData);


if (FAILED(hresError))
{
printf ("ERROR: Setting the VR Path Failed! Error: %d (%#x)/n", hresError, hresError);
hresError = pcAdmCom->CloseKey(hmdChildHandle);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

printf ("Successfully set the vrpath/n");



/***********************************/
// Second, add the MD_KEY_TYPE - this indicates what type of key we are creating -
// The vroot type is IISWebVirtualDir
mdrNewVrootData.dwMDIdentifier = MD_KEY_TYPE;

// The inheritable attribute means that paths that are created underneath this
// path will retain the property from the parent node unless overwritten at the
// new child node.
mdrNewVrootData.dwMDAttributes = METADATA_INHERIT;
mdrNewVrootData.dwMDUserType = IIS_MD_UT_FILE;
mdrNewVrootData.dwMDDataType = STRING_METADATA;

// Now, create the string. - UNICODE
mdrNewVrootData.pbMDData = (PBYTE) TEXT("IIsWebServer");
mdrNewVrootData.dwMDDataLen = (wcslen (TEXT("IIsWebServer")) + 1) * sizeof (WCHAR);
mdrNewVrootData.dwMDDataTag = 0; // datatag is a reserved field.

// Now, set the property at the new path in the metabase.
hresError = pcAdmCom->SetData (
hmdChildHandle,
TEXT ("/"),
&mdrNewVrootData);


if (FAILED(hresError))
{
printf ("ERROR: Setting the Keytype Failed! Error: %d (%#x)/n", hresError, hresError);
hresError = pcAdmCom->CloseKey(hmdChildHandle);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

printf ("Successfully set the Keytype /n");


/***********************************/
// Now, add the MD_ACCESS_PERM - this tells whether we should read, write or
// execute files within the directory. For now, we will simply add
// READ permissions.
mdrNewVrootData.dwMDIdentifier = MD_ACCESS_PERM;

// The inheritable attribute means that paths that are created underneath this
// path will retain the property from the parent node unless overwritten at the
// new child node.
mdrNewVrootData.dwMDAttributes = METADATA_INHERIT;
mdrNewVrootData.dwMDUserType = IIS_MD_UT_FILE;
mdrNewVrootData.dwMDDataType = DWORD_METADATA;

//Create the access perm.
DWORD dwAccessPerm = MD_ACCESS_READ | MD_ACCESS_SCRIPT; // 1 is read only
mdrNewVrootData.pbMDData = (PBYTE) &dwAccessPerm;
mdrNewVrootData.dwMDDataLen = sizeof (DWORD);
mdrNewVrootData.dwMDDataTag = 0; // datatag is a reserved field.



// Now, set the property at the new path in the metabase.
hresError = pcAdmCom->SetData (
hmdChildHandle,
TEXT ("/"),
&mdrNewVrootData);


if (FAILED(hresError))
{
printf ("ERROR: Setting the accessperm failed! Error: %d (%#x)/n", hresError, hresError);
hresError = pcAdmCom->CloseKey(hmdChildHandle);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}

printf ("Successfully set the accessperm/n");



mdrNewVrootData.dwMDIdentifier = MD_ALLOW_PATH_INFO_FOR_SCRIPT_MAPPINGS;

// The inheritable attribute means that paths that are created underneath this
// path will retain the property from the parent node unless overwritten at the
// new child node.
mdrNewVrootData.dwMDAttributes = METADATA_INHERIT;
mdrNewVrootData.dwMDUserType = IIS_MD_UT_SERVER;
mdrNewVrootData.dwMDDataType = DWORD_METADATA;

//Create the access perm.
bool BAllow = true;
mdrNewVrootData.pbMDData = (unsigned char*) &BAllow;
mdrNewVrootData.dwMDDataLen = sizeof (bool);
mdrNewVrootData.dwMDDataTag = 0; // datatag is a reserved field.

hresError = pcAdmCom->SetData (
hmdChildHandle,
TEXT ("/"),
&mdrNewVrootData);


if (FAILED(hresError))
{
printf ("ERROR: Setting the accessperm failed! Error: %d (%#x)/n", hresError, hresError);
hresError = pcAdmCom->CloseKey(hmdChildHandle);
dwRefCount = pcAdmCom->Release();
::Sleep(10000);
return hresError;
}
 
还差两个属性没找到文档, 大家帮我研究一下,
设置 asp 的
 
//创建虚拟目录
procedure TForm1.Button1Click(Sender: TObject);
var
WebSite, WebServer, WebRoot, VDir: Variant;
begin
WebSite := CreateOleObject('IISNamespace');
WebSite := WebSite.GetObject('IIsWebService', 'localhost/w3svc');
WebServer := WebSite.GetObject('IIsWebServer', '1');
WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');
VDir := WebRoot.Create('IIsWebVirtualDir', 'ttt');
VDir.AccessRead := True;
VDir.Path := 'C:/ttt';
VDir.SetInfo;
end;

//创建站点
procedure TForm1.Button2Click(Sender: TObject);
var
ArgCount, WRoot, WNumber, WComment:Variant;
WPort, BindingsList, ServerRun:Variant;
ServiceObj, ServerObj, VDirObj:Variant;
begin
ArgCount:=0;WRoot:='c:/ttt';
WNumber:=4;
WComment:='sampleserver';
WPort:=84;
// new Array(":84:"); // default port; NOTE: takes an array of strings
ServerRun:=true;
ServiceObj:= CreateOleObject('IISNamespace');//IIS://Localhost/W3SVC');
ServiceObj:=ServiceObj.GetObject('IIsWebService', 'localhost/w3svc');
ServerObj:= ServiceObj.Create('IIsWebServer', WNumber);
ServerObj.ServerSize:= 1; // Medium-sized server;
ServerObj.ServerComment := WComment;
ServerObj.ServerBindings := WPort;
// Write info back to Metabase
ServerObj.SetInfo();
// ** Create virtual root directory **
VDirObj := ServerObj.Create('IIsWebVirtualDir', 'ROOT');
// Configure new virtual root
VDirObj.Path := WRoot;
VDirObj.AccessRead := true;
VDirObj.AccessWrite := true;
VDirObj.EnableDirBrowsing := true;
// Write info back to Metabase
VDirObj.SetInfo();
if ServerRun then
ServerObj.Start();
end;
end.
 
unit Unit_IISWebService;
//jingtao.http://www.138soft.com.2004.3.2.
interface
uses
Windows,SysUtils,Variants,ActiveX,Unit_AdsComInterface,Dialogs;

function CreateWebSite(const strWebSiteName,{服务器名称}
strPhysicalPath,{目录路径}
strConstDoMainHead,{主机头.格式为 IP地址:端口:主机头#13...}
strDefaultDoc:string;{默认文档.格式为 'default.asp,index.asp,default.htm,index.htm'}
const dwPermissions:DWORD; {目录的权限}
const bEnableDefaultDoc:Bool;{是否使用默认文档}
var dwWebSite:DWORD){返回站点的编号}
:Bool;
function StartWebSite(const dwWebSite:DWORD):Bool;
function PauseWebSite(const dwWebSite:DWORD):Bool;
function StopWebSite(const dwWebSite:DWORD):Bool;
function DelWebSite(const dwWebSite:DWORD):Bool;
function WebSiteExists(const dwWebSite:DWORD):Bool;
implementation
function ControlWebSite(const dwWebSite,iCode:DWORD):Bool;
var
hr:HRESULT;
WebService:IADsContainer;
WebServerDisp:IDispatch;
WebServer:IADs;
//SrvOp:IADsServiceOperations;
begin
Result:=False;
try
hr := ADsGetObject('IIS://Localhost/w3svc', IID_IADsContainer, WebService);
if (FAILED(hr)) then Exit;
hr:=WebService.GetObject('IIsWebServer',InttoStr(dwWebSite),WebServerDisp);
if (FAILED(hr)) then Exit;
hr:=WebServerDisp.QueryInterface(IID_IADs,WebServer);//获取server对象
if ( FAILED(hr)) then Exit;
WebServer.Put('ServerState',Variant(integer(iCode)));
WebServer.SetInfo;
//hr:=WebServerDisp.QueryInterface(IID_IADsServiceOperations,SrvOp);//获取server对象
//if (FAILED(hr)) then Exit;
//SrvOp.Start;
except
Exit;
end;
Result:=True;
end;
function StartWebSite(const dwWebSite:DWORD):Bool;
begin
Result:=ControlWebSite(dwWebSite,2);
end;
function PauseWebSite(const dwWebSite:DWORD):Bool;
begin
Result:=ControlWebSite(dwWebSite,6);
end;
function StopWebSite(const dwWebSite:DWORD):Bool;
begin
Result:=ControlWebSite(dwWebSite,4);
end;
function DelWebSite(const dwWebSite:DWORD):Bool;
var
hr:HRESULT;
WebService:IADsContainer;
begin
Result:=False;
try
hr := ADsGetObject('IIS://Localhost/w3svc', IID_IADsContainer, WebService);
if (FAILED(hr)) then Exit;
hr:=WebService.Delete('IIsWebServer',IntToStr(dwWebSite));
if (FAILED(hr)) then Exit;
except
Exit;
end;
Result:=True;
end;
function WebSiteExists(const dwWebSite:DWORD):Bool;
type
TArrayInteger=array of integer;
procedure GetAlldwWebSite(var arrayWebSite:TArrayInteger);
var
NSContainer : IADsContainer;
Enum : IEnumVariant;
hr : HRESULT;
varArr : OleVariant;
lNumElements : ULONG;
item : IADs;
i,iCode,iLength:integer;
s : String;
//p:IDirectoryObject;
begin
// CoInitialize(nil);
NSContainer:=nil;
ADsGetObject( 'IIS://Localhost/w3svc', IADsContainer, NSContainer);
Enum :=nil;
hr := ADsBuildEnumerator(NSContainer,Enum);
while SUCCEEDED(hr) do
begin
hr := ADsEnumerateNext(Enum,1,varArr,lNumElements);
if (lNumElements<=0) then break;
IDispatch(varArr).QueryInterface(IADs, item) ;
s := item.Name;
Val(s,i,iCode);
if iCode=0 then
begin
iLength:=Length(arrayWebSite);
SetLength(arrayWebSite,(iLength+1));
arrayWebSite[iLength]:=i;
end;
end;
NSContainer:=nil;
Enum :=nil;
// CoUninitialize;
end;
var
MyarrayWebSite:TArrayInteger;
i:integer;
//bExists:Boolean;
begin
Result:=False;
GetAlldwWebSite(MyarrayWebSite);
for i:=0 to Length(MyarrayWebSite)-1 do
if dwWebSite=MyarrayWebSite then
begin
Result:=True;
Exit;
end;
end;
function GetdwWebSite:integer;
var
i:integer;
begin
Randomize;
Result:=Random(1000);
for i:=1 to 1000 do
if not WebSiteExists(i)
then begin Result:=i;Exit;end;
end;
{
//dwPermissions
//1: read 2:write 3:read|write 4:ACCESS_SCRIPT
//5:read|ACCESS_SCRIPT 6:write|ACCESS_SCRIPT 7:read|write|ACCESS_SCRIPT
}
function CreateWebSite(const strWebSiteName,{服务器名称}
strPhysicalPath,{目录路径}
strConstDoMainHead,{主机头.格式为 IP地址:端口:主机头#13...}
strDefaultDoc:string;{默认文档.格式为 'default.asp,index.asp,default.htm,index.htm'}
const dwPermissions:DWORD; {目录的权限}
const bEnableDefaultDoc:Bool;{是否使用默认文档}
var dwWebSite:DWORD){返回站点的编号}
:Bool;
var
hr:HRESULT;
WebService:IADsContainer;
WebServerDisp:IDispatch;
WebServer:IADs;
VirtualDirService:IADsContainer;
VirtualDirDisp:IDispatch;
VirtualDir:IADs;
i,iCount,iPos:integer;
strVarDoMainHead:string;
//arrayStrDoMainHead:array of string;
VariantDoMainHead :Variant;
begin
//CoInitialize(nil);{初始化COM}
Result:=False;
try
hr := ADsGetObject('IIS://Localhost/w3svc', IID_IADsContainer, WebService);
if (FAILED(hr)) then Exit;
dwWebSite:=GetdwWebSite;
//Showmessage(inttostr(dwWebSite));
hr:=WebService.Create('IIsWebServer',IntToStr(dwWebSite),WebServerDisp);
if (FAILED(hr)) then Exit;
hr:=WebServerDisp.QueryInterface(IID_IADs,WebServer);//获取server对象
if ( FAILED(hr)) then Exit;
WebServer.Put('ServerSize',Variant(integer(1)));
WebServer.Put('ServerAutoStart',Variant(integer(1)));
WebServer.Put('ServerComment',Variant(String(strWebSiteName)));
WebServer.Put('EnableDefaultDoc',Variant(BOOL(bEnableDefaultDoc)));{允许默认文档}
WebServer.Put('DefaultDoc',Variant(String(strDefaultDoc)));{指定默认文档}
WebServer.Put('FrontPageWeb',Variant(DWORD(1)));

strVarDoMainHead:=strConstDoMainHead;
iCount:=0;
for i:=1 to Length(strVarDoMainHead) do if strVarDoMainHead=#13 then Inc(iCount);
//VariantDoMainHead := VarArrayCreate([0, iCount], varVariant);{不减去1的话,会多一个"全部未分配"}
VariantDoMainHead := VarArrayCreate([0, Pred(iCount)], varVariant);{设置主机头}
for i:=0 to Pred(iCount) do
begin
iPos:=Pos(#13,strVarDoMainHead);
VariantDoMainHead :=Copy(strVarDoMainHead,1,Pred(iPos));
Delete(strVarDoMainHead,1,iPos);
end;
WebServer.Put('ServerBindings',VariantDoMainHead);//Variant(String(strDoMainIP+':'+IntToStr(dwDoMainPort)+':'+strDoMainName)));
WebServer.SetInfo();//更新MetaBase

hr:=WebServerDisp.QueryInterface(IID_IADsContainer,VirtualDirService);
if ( FAILED(hr)) then Exit;
hr:=VirtualDirService.Create('IIsWebVirtualDir','ROOT',VirtualDirDisp);
if ( FAILED(hr)) then Exit;

hr:=VirtualDirDisp.QueryInterface(IID_IADs,VirtualDir);
if ( FAILED(hr)) then Exit;

//dwPermissions
//1: read 2:write 3:read|write 4:ACCESS_SCRIPT
//5:read|ACCESS_SCRIPT 6:write|ACCESS_SCRIPT 7:read|write|ACCESS_SCRIPT
VirtualDir.Put('AccessFlags',Variant(integer(dwPermissions)));
{
VirtualDir.Put('AccessRead',Variant(BOOL(True)));
VirtualDir.Put('AccessWrite',Variant(BOOL(True)));
VirtualDir.Put('AccessScript',Variant(BOOL(True)));
}
VirtualDir.Put('EnableDirBrowsing',Variant(BOOL(True)));
VirtualDir.Put('EnableDefaultDoc',Variant(BOOL(bEnableDefaultDoc)));
VirtualDir.Put('FrontPageWeb',Variant(integer(1)));
VirtualDir.Put('Path',Variant(String(strPhysicalPath)));

VirtualDir.Put('AppIsolated',Variant(integer(2)));
//VirtualDir.Put('AppRoot',Variant(String(strPhysicalPath)));
VirtualDir.Put('AppRoot',Variant(String('/LM/W3SVC/'+inttostr(dwWebSite)+'/Root')));
VirtualDir.Put('AppFriendlyName',Variant(String('默认应用程序')));
VirtualDir.SetInfo ();
except
Exit;
end;
Result:=True;
WebService:=nil;
WebServerDisp:=nil;
WebServer:=nil;
VirtualDirService:=nil;
VirtualDirDisp:=nil;
VirtualDir:=nil;
//CoUninitialize;
end;
initialization
CoInitialize(nil);
finalization
CoUninitialize;
end.
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=188072
标题是: 在IIS4中如何编程添加一个虚礼目录 (吐血求知)
 
还是我这个全面
function CreateWebSite(const strWebSiteName,{服务器名称}
strPhysicalPath,{目录路径}
strConstDoMainHead,{主机头.格式为 IP地址:端口:主机头#13...}
strDefaultDoc:string;{默认文档.格式为 'default.asp,index.asp,default.htm,index.htm'}
const dwPermissions:DWORD; {目录的权限}
const bEnableDefaultDoc:Bool;{是否使用默认文档}
var dwWebSite:DWORD){返回站点的编号}
:Bool;

所有属性全部有了.建立虚拟目录是很简单的.麻烦的是建立站点.这个其实是为一个大型空间商写的组件的一部分.直接后台建立站点的.
 
后退
顶部