To aiirii(ari): 怎么我在用时,在这句老是有错呀? ts.add(name);调试时,name已经取得第一台SQL Server的名称了,但在执行ADD时会出错。 在D6中运行时提示: Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00401D0F in module 'Project1.exe'. Read of address 7A83668E'. Process stopped. Use Step or Run to continue.为什么?
var
i: integer;
sRetValue: String;
SQLServer: Variant;
ServerList: Variant;
begin
Result := False;
List.Clear;
try
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList := SQLServer.ListAvailableSQLServers;
for i := 1 to Serverlist.Count do
list.Add (Serverlist.item(i));
Result := True;
Finally
SQLServer := NULL;
ServerList := NULL;
end;
end;
const
SV_TYPE_SQLSERVER = $00000004;
type
pDword = ^DWord;
NET_API_STATUS = DWORD;
SERVER_INFO_100 = record
sv100_platform_id : DWord;
sv100_name : pwidechar;
end; PSERVER_INFO_100 = ^SERVER_INFO_100;
LPSERVER_INFO_100 = ^SERVER_INFO_100;
ASERVER_INFO_100 = array of SERVER_INFO_100; SERVER_INFO_101 = record
sv101_platform_id : dword;
sv101_name : pwidechar;
sv101_version_major : Dword;
sv101_version_minor : Dword;
sv101_type : dword;
sv101_comment : pchar;
end; PSERVER_INFO_101 = ^SERVER_INFO_101;
LPSERVER_INFO_101 = ^SERVER_INFO_101;
ASERVER_INFO_101 = array of SERVER_INFO_101;
function NetServerEnum(servername : pchar; level : Dword; var bufptr;
prefmaxlen : integer; entriesread : pDword; totalentries : pDword;
servertype : DWord; domain : pwidechar; resume_handle : integer)
: NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetServerEnum';function NetApiBufferFree (Buffer : pointer) : NET_API_STATUS;
stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
procedure EnumNetwork(ts: TStrings);
var
pBuf : pByte;
aBuf : ASERVER_INFO_100;
dwEntriesRead : DWORD;
dwTotalEntries : DWORD;
dwServerType : DWORD;
i : DWORD;
name : string;
begin
pBuf := nil;
dwEntriesRead := 0;
dwTotalEntries := 0;
dwServerType := SV_TYPE_SQLSERVER; // all servers NetServerEnum(nil, 100, pBuf, -1,
@dwEntriesRead, @dwTotalEntries, dwServerType, nil, 0); aBuf := ASERVER_INFO_100(pBuf); for i := 0 to dwEntriesRead - 1 do
begin
name := aBuf[i].sv100_name;
ts.add(name);
// name is the name of the SQL Server in the network
end;
if Assigned(pBuf) then NetApiBufferFree(pBuf);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
EnumNetwork(ListBox1.items);
end;
谢谢,至少在装了SQL Server的PC上有用:)
具體你可到這裹問樓主, 我也是回答他的問題的http://expert.csdn.net/Expert/topic/2415/2415164.xml?temp=.1251795
怎么我在用时,在这句老是有错呀?
ts.add(name);调试时,name已经取得第一台SQL Server的名称了,但在执行ADD时会出错。
在D6中运行时提示:
Project Project1.exe raised exception class EAccessViolation with message
'Access violation at address 00401D0F in module 'Project1.exe'. Read of
address 7A83668E'. Process stopped. Use Step or Run to continue.为什么?
出现这个问题我都是这么解决的。
將下面這句注釋掉試試
if Assigned(pBuf) then NetApiBufferFree(pBuf);
type
NET_API_STATUS = DWORD; PServerInfo100 = ^TServerInfo100;
_SERVER_INFO_100 = record
sv100_platform_id: DWORD;
sv100_name: LPWSTR;
end;
{$EXTERNALSYM _SERVER_INFO_100}
TServerInfo100 = _SERVER_INFO_100;
SERVER_INFO_100 = _SERVER_INFO_100;
{$EXTERNALSYM SERVER_INFO_100}const
NERR_Success = 0;
MAX_PREFERRED_LENGTH = DWORD(-1);
SV_TYPE_SQLSERVER = $00000004;function NetApiBufferAllocate(ByteCount: DWORD; var Buffer: Pointer):
NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetApiBufferAllocate';function NetServerEnum(ServerName: LPCWSTR; Level: DWORD; var BufPtr: Pointer;
PrefMaxLen: DWORD; var EntriesRead: DWORD; var TotalEntries: DWORD;
ServerType: DWORD; Domain: LPCWSTR; ResumeHandle: PDWORD): NET_API_STATUS;
stdcall; external 'netapi32.dll' name 'NetServerEnum';function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external
'netapi32.dll' name 'NetApiBufferFree';function GetSQLServerList(out AList: TStrings; pwcServerName: PWChar = nil;
pwcDomain: PWChar = nil): Boolean;
var
NetAPIStatus: DWORD;
dwLevel: DWORD;
pReturnSvrInfo: Pointer;
dwPrefMaxLen: DWORD;
dwEntriesRead: DWORD;
dwTotalEntries: DWORD;
dwServerType: DWORD;
dwResumeHandle: PDWORD;
pCurSvrInfo: PServerInfo100;
i, j: Integer;
begin
Result := True;
try
if Trim(pwcServerName) = '' then
pwcServerName := nil; if Trim(pwcDomain) = '' then
pwcDomain := nil; dwLevel := 100;
pReturnSvrInfo := nil;
dwPrefMaxLen := MAX_PREFERRED_LENGTH;
dwEntriesRead := 0;
dwTotalEntries := 0;
dwServerType := SV_TYPE_SQLSERVER;
dwResumeHandle := nil; NetApiBufferAllocate(SizeOf(pReturnSvrInfo), pReturnSvrInfo);
try
NetAPIStatus := NetServerEnum(pwcServerName, dwLevel, pReturnSvrInfo,
dwPrefMaxLen, dwEntriesRead, dwTotalEntries, dwServerType, pwcDomain,
dwResumeHandle); if (NetAPIStatus = NERR_Success) and (pReturnSvrInfo <> nil) then
begin
pCurSvrInfo := pReturnSvrInfo; // 循环取得所有服务
i := 0;
j := dwEntriesRead;
while i < j do
begin
if pCurSvrInfo = nil then
Break; with AList do
Add(pCurSvrInfo^.sv100_name); Inc(i);
Inc(pCurSvrInfo);
end;
end;
finally
if Assigned(pReturnSvrInfo) then
NetApiBufferFree(pReturnSvrInfo);
end;
except
Result := False;
end;
end;用法如下:
var
List: TStringList;
lstBox: TListBox;
begin
List := TStringList.Create;
try
GetSQLServerList(List);
lstBox.Items := List;
finally
List.Free;
end;
end;
EnumNetwork(ListBox1.items);你應該在你的窗體上放一個 ListBox1將下面這句注釋掉試試
if Assigned(pBuf) then NetApiBufferFree(pBuf);