На этом шаге мы рассмотрим реализацию методов компонента.
Теперь, реализовав свойство Key, Вы можете добавлять код метода EncodeString().
- Реализация метода EncodeString().
- В меню View выберите команду Workspace и затем щелкните вкладку ClassView.
- Нажмите знак "+" рядом с узлом CEncoder, чтобы раскрыть содержимое этого класса.
- Нажмите знак "+" рядом с узлом IEncoder, чтобы раскрыть содержимое этого интерфейса.
Рис.1. ClassView с методами интерфейса IEncoder - Дважды щелкните метод EncodeString(). Откроется окно редактирования
тела функции EncodeString(), реализованного в файле Encoder.cpp. - Добавьте в тело EncodeString() код следующего вида:
STDMETHODIMP CEncoder::EncodeString(const BSTR instring, BSTR *outstring) { BSTR tempstring = ::SysAllocString(instring); wcscpy(tempstring, instring); for(UINT i = 0; i < ::SysStringLen(tempstring); i++) tempstring[i] += m_Key; *outstring = ::SysAllocString(tempstring); ::SysFreeString(tempstring); return S_OK; }
Рис.2. Функция EncodeString()
Для понимания приведенной выше функции Вам могут понадобься дополнительные знания о BSTR. BSTR - это по существу
указатель на строку Unicode-символов типа wchar_t. Здесь видно, как К-параметр передается
в стандартную библиотечную функцию wspy(). Однако BSTR не просто массив символов - в его
начале находится 4-байтовое целое число, указывающее на число байт в данной строке. А это значит, что Вы обязаны
выделить память для BSTR с помощыо Win32-функции SysAllocString(). В приведенном
ниже примере память для переменной типа BSTR выделяется на основе уже
существующей BSTR. Еще один способ выделения памяти для BSTR - на основе массива wchar_t, как показано ниже:
wchar_t wszPeas[] = L"Visualize Whirled Peas"; BSTR bstrPeas = ::SysAllocString(wszPeas);
Закончив работать с BSTR-переменной, освободите занимаем ею память, вызвав SysFreeString(). Обратите внимание, что в
нашем примере мы не освобождаем память, занятую переменной outstring, так как ее необходимо вернуть клиенту.
В СОМ освобождение ресурсов, выделенных сервером при выполнении запроса, входит в обязанности клиента.
Заметьте также, что EncodeString() обращается к функции SysStringLen() для определения длины (в символах) BSTR.
Теперь Вы можете приступать к сборке проекта Encode Server. После успешной компиляции и компоновки
Visual Studio самостоятельно зарегистрирует Ваш объект Encoder на локальной машине, сделав его
доступным приложениям-клиентам.
Текст этого приложения можно взять здесь (28,5 Кб).
Со следующего шага мы начнем более детально изучать код ATL COM-компонента.