Есть некий Win32 сервис, из которого наружу торчит интерфейс и есть программа-конфигуратор, которая получает некоторые данные при помощи этого интерфейса. Ниже приведу несколько кусков кода, которые помогут пониманию проблемы.
В сервисе есть класс:
TConnectionPoolManager = class(TObject)
private
fPools: TObjectList;
fAllPoolSize: Integer;
function GetPoolCount: Integer;
function GetPool(aIndex: Integer): TConnectionPool;
public
constructor Create(aPoolSize: Integer);
destructor Destroy; override;
function AcquireConnection(aServer, aSchema, aUserName, aPassword: String): TConnectionItem;
procedure ReleaseConnection(aConn: TConnectionItem);
property AllPoolSize: Integer read fAllPoolSize;
property PoolCount: Integer read GetPoolCount;
property Pools[Index: Integer]: TConnectionPool read GetPool;
end;
...
constructor TConnectionPoolManager.Create(aPoolSize: Integer);
begin
fPools := TObjectList.Create;
fPools.OwnsObjects := True;
end;
destructor TConnectionPoolManager.Destroy;
begin
FreeAndNil(fPools);
inherited;
end;
...
function TConnectionPoolManager.GetPoolCount: Integer;
begin
Result := fPools.Count;
end;
function TConnectionPoolManager.GetPool(aIndex: Integer): TConnectionPool;
begin
Result := TConnectionPool(fPools[aIndex]);
end;
Вот интерфейс
IHRMDataService = interface(IUnknown)
['']
function Get_PoolCount: Integer; stdcall;
function Get_Servers(Index: Integer; out Value: PChar): HResult; stdcall;
function Get_Schemas(Index: Integer; out Value: PChar): HResult; stdcall;
end;
И реализация:
function THRMDataService.Get_PoolCount: Integer;
begin
Result := -1;
if Assigned(g_Manager) then
Result := g_Manager.PoolCount;
end;
function THRMDataService.Get_Servers(Index: Integer;
out Value: PChar): HResult;
begin
Result := S_FALSE;
Value := '';
if Assigned(g_Manager) then
begin
Result := S_OK;
Value := PChar(g_Manager.Pools[Index].Server);
end;
end;
function THRMDataService.Get_Schemas(Index: Integer;
out Value: PChar): HResult;
begin
Result := S_FALSE;
Value := '';
if Assigned(g_Manager) then
begin
Result := S_OK;
Value := PChar(g_Manager.Pools[Index].Schema);
end;
end;
Где g_Manager описан в отдельном юните:
unit uGlobals;
interface
uses uConnectionPoolManager;
var
g_Manager: TConnectionPoolManager;
implementation
uses SysUtils;
initialization
g_Manager := TConnectionPoolManager.Create(3);
finalization
FreeAndNil(g_Manager);
end.
Собственно, проблема в следующем. Сервис работает, данные выдает (это http-сервер на определенном порту). Но если я к нему пытаюсь достучаться из конфигуратора (через COM), то мне возвращаются только нули и пустые строки.
procedure TForm1.Button1Click(Sender: TObject);
var
s: IHRMDataService;
c: PChar;
begin
s := CreateComObject(CLASS_HRMDataService) as IHRMDataService;
try
Memo1.Lines.Add(Format('Pool count: %d',[s.Get_PoolCount]));
s.Get_Servers(0, c);
Memo1.Lines.Add(c);
finally
s := nil;
end;
end;
По требованию предоставлю полный текст программы.