Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];

Вниз

сервис и 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 вся ветка

Форум: "Corba";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1297334599
Tonick2001
2011-02-10 13:43
2011.05.29
SQL ip to number


10-1169119535
Brenagwynn
2007-01-18 14:25
2011.05.29
сервис и COM


15-1297097095
***
2011-02-07 19:44
2011.05.29
Промо ролик демонстраций по физике НИЯУ МИФИ


15-1297727471
KilkennyCat
2011-02-15 02:51
2011.05.29
Как можно успеть?!


15-1297718999
Юрий
2011-02-15 00:29
2011.05.29
С днем рождения ! 15 февраля 2011 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский