Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.29;
Скачать: CL | DM;

Вниз

сервис и COM   Найти похожие ветки 

 
Brenagwynn   (2007-01-18 14:25) [0]

Есть некий 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)
   ["{C311580A-8AC5-4B69-834D-5B6DA89BD9DE}"]
   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])); // ВЫДАЕТ 0, хотя их точно не 0, потому что сервис работает
   s.Get_Servers(0, c);
   Memo1.Lines.Add(c); // пустая строка, что ГАРАНТИРОВАНО неправда, потому что сервис работает
 finally
   s := nil;
 end;
end;

По требованию предоставлю полный текст программы.


 
tesseract ©   (2007-01-18 16:17) [1]

откуда PChar/string в COM? Только WideString ака OleString;

И пошаговую отладку никто не отменял.


 
Brenagwynn   (2007-01-18 16:46) [2]

Все, разобрался. Ерунду написал. CreateComObject аж никак не будет использовать существующий инстанс, а просто запустит еще один экземпляр, у которого есессно все по нулям :(


 
tesseract ©   (2007-01-20 17:47) [3]

> CreateComObject аж никак не будет использовать существующий
> инстанс,


Может и существующий использовать. Зависит от Threading model.


 
VladimirSh ©   (2007-03-11 02:12) [4]


> Все, разобрался. Ерунду написал. CreateComObject аж никак
> не будет использовать существующий инстанс, а просто запустит
> еще один экземпляр, у которого есессно все по нулям :(


У меня такая же проблема, срочно нужна помощь.

Как это решается, и что нужно сделать вместо CreateComObject?
Понимаю, что нужно вместо создания нового объекта найти в сервисе предыдущий инстанс Co... класса и вернуть указатель на него.

Помогите, люди добрые!!!


 
isasa ©   (2007-03-11 11:17) [5]

Сразу бросилось в глаза

IHRMDataService = interface(IUnknown)

надо бы для COM
IHRMDataService = interface(IDispatch)


 
tesseract ©   (2007-03-12 11:44) [6]


> надо бы для COMIHRMDataService = interface(IDispatch)


Это для OLE для Com как раз Iunknown.


 
umbra ©   (2007-03-13 15:08) [7]

пример того, как можно использовать СОМ в сервисе можно посмотреть в http://code.progler.ru/get/259



Страницы: 1 вся ветка

Текущий архив: 2011.05.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
1-1255414815
Игорь
2009-10-13 10:20
2011.05.29
ConstrainedResize


2-1298137486
Артём
2011-02-19 20:44
2011.05.29
Отображение HTML в Panel


2-1297944223
Ghost del vonte
2011-02-17 15:03
2011.05.29
Указатель на последниий компонент потока


15-1297546203
Юрий
2011-02-13 00:30
2011.05.29
С днем рождения ! 13 февраля 2011 воскресенье


2-1298200252
ddd329
2011-02-20 14:10
2011.05.29
MDI форма в пределах окна?