Как ATL способ открыть именованный канал в Windows в C ++? - PullRequest
2 голосов
/ 09 сентября 2010
hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file 

Как преобразовать вышеприведенное в ATL, чтобы канал автоматически закрывался при разрушении компонента COM?

Ответы [ 2 ]

6 голосов
/ 09 сентября 2010

Я должен угадать, на какой COM-компонент вы ссылаетесь, поскольку ваш пост был расплывчатым. Но я предполагаю, что вы написали COM-компонент, который использует или иным образом использует именованный канал, и вы хотите, чтобы он автоматически освобождался (ala RAII ), когда этот COM-компонент уничтожается.

В этом случае вы должны поместить любой код очистки в метод компонента FinalRelease () , например:

void CoMyObject::FinalRelease()
{
  CloseHandle(my_pipe_handle_);
}

Другая сторона монеты одноразовой очистки - это код одноразовой инициализации. Если вы также хотите открыть этот именованный канал при создании экземпляра COM-компонента - что указывает ваш заголовок, но не говорится в вашем посте - тогда вы сделаете это в методе FinalConstruct () вашего объекта:

HRESULT CoMyObject::FinalConstruct()
{
  my_pipe_handle_ = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file }

  return S_OK;
}
0 голосов
/ 10 сентября 2010
#include <atlbase.h>
#include <atlfile.h>

CAtlFile m_file;
m_file.Create(lpszPipeName, GENERIC_READ|GENERIC_WRITE, 0, OPEN_EXISTING);

Предположительно, m_file является переменной-членом вашего класса. Когда ваш экземпляр класса получит свой окончательный выпуск (и впоследствии уничтожен), деструктор m_file закроет дескриптор, связанный с каналом.

...