Доброе время суток уважаемый.
DS>Подключаюсь к серверу функцией RpcBindingFromStringBinding.
DS>Но даже если серверная часть приложения не запущена эта
DS>функция фозвращает RPC_S_OK. Почему так происходит ?
DS>Как отследить что сервер не запущен на стадии подключения?
Из моих личных наблюдений (могу и ошибаться), RpcBindingFromStringBinding() просто
создает привязку протокола передачи к RPC, настройку стандартного маршалинга,
после чего возвращает состояние реализации приваяки: удачно или нет.
/////////////////
//
// serverRPCCode.cpp
// прототип RPC_StartServer()
boolean RPC_StartServer(void);
/////////////////
// admCode.cpp
#include "IServer_s.c" // Генерируется MIDL'ом
#include "IServer.h" // Генерируется MIDL'ом
// ....
RpcTryExcept
{
if (!RPC_StartServer())
AfxMessageBox("Can't start server.");
}
RpcExcept(1)
{
char* str = (char*)malloc(20);
ulCode = RpcExceptionCode(); // 0x06A6 (1702) - на эту ошибку проверять в
// случае отсутствия сервера или корректной привязки.
sprintf(str, "Runtime reported exception 0x%lx = %ld\n", ulCode, ulCode);
AfxMessageBox(str);
free(str);
}
RpcEndExcept
Вышеприведенный код — из личного проекта. Проверка на результат функции невозможна.
RPC генерирует исключение. Единственный коментарий к коду — при проверке на наличие
активной копии ловить не все исключения (как у меня), а пару-тройку определенных.
А то можно словить не то, что хотелось. Ж%)
А это черевато падением программы со своих нечестно занятых мегабайтов...
Точно.
Только перехватом исключений
Здравствуйте Максим Алексейкин, Вы писали:
МА>Точно.
МА>Только перехватом исключений
Да ладно вам. Не все так страшно.
Необходимо просто создать файл IDL_NAME.ACF — и запустить IDL_NAME.IDL на компиляцию...
Например:
interface TEST{
[comm_status, fault_status] RPC_Test();
}
После это, если сервер не загружен, функция просто вернет ошибку... Никаких трапов не будет...