Есть схема:
клиент->Service.exe(ATL)->LDAPкомпонент(ATL)-> LDAP Server.
Сервис создает объект LDAP и через него получает данные от LDAP сервера.
Раньше было реализовано так:
Сервис при получени запроса от клиента:
HRESULT ConnectionStatus;
CComPtr<ILDAP> pLDAP;
pLDAP.CoCreateInstance(CLSID_LDAP);
ConnectionStatus=pLDAP->Connect(HostName , port );
if ( ConnectionStatus == S_FALSE )
goto errLabel;
pLDAP->GetData(user);
Сервис из конфигурационной хмлки получает имя хоста(HostName) и Номер порта(port).
Метод Сonnect — просто открытие коннекта к LDAP серверу: LDAPConnection=ldap_open(server,port);
Соответственно LDAPConnection объявлена private в кслассе CLDAP.
Соответственно FinalRelease LDAP компонета имеет вид:
void FinalRelease()
{
m_pUnkMarshaler.Release();
if ( LDAPConnection != NULL )
ldap_unbind( LDAPConnection );
}
Тут проблем никаких — при уничтожении объекта убивается коннект с сервером.
Сервер один, т.е. все клиенты коннектятся к одному и тому же серверу.
Встала задача сделать коннект в
FinalConstruct, так как метод Connect по сути для одного объекта вызывается один раз только для того чтобы подрубится к серверу.
Все это для организации пула на много коннектов. Чтобы мы могли только при переключении объектов только вызывать нужные методы а не конектиться/дисконектиться заново.
Так вот все никак не получается это нормально сделать

(
Кроме тупого варианта писать в сервисе имя сервера и порт в реестр и потом оттуда извлекать их из реестра. В компоненте читать xmlку нельзя!!!
HRESULT FinalConstruct() {
// m_ldapConnection = ldap_open("LDAPServer", 3128);
// m_ldapConnection = ldap_open(Server, ServerPort);
if ( m_ldapConnection == NULL ) return S_FALSE;
return CoCreateFreeThreadedMarshaler(
GetControllingUnknown(), &m_pUnkMarshaler.p);
}
Жду советов...