FinalConstruct() и подключение к LDAP серверу
От: DMA  
Дата: 12.01.03 12:47
Оценка:
Есть схема:
клиент->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);
    }

Жду советов...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.