GetBinderyObjectID

Обсуждение технических вопросов по продуктам Novell

GetBinderyObjectID

Сообщение Andrew Pushkarev » 17 окт 2008, 13:48

Netware 6.0 sp5, есть эмуляция Bindery.
Коллега программист в своих программах использует удобную ему функцию для определения сатуса пользователя (подключен/не подключен к серверу). Для этого использует функцию: GetBinderyObjectID(USER, User, &UsID). Полный текст одной из программ прилагается ниже. При наличии РЕАЛЬНОГО коннекта на сервере (станция вполне успешно работает), программа с вероятностью 50/50 определяет статус как подключен, или как не подключен. От сетевого клиента не зависит. Симптом может исчезнуть после перезагрузки станции. Перезагрузка сервера, или выполнения Dsrepair как правило устраняет симптом.
Хотелось бы понять причину, по которой GetBinderyObjectID(USER, User, &UsID) может отрабатывать с “ошибкой”.

Исходный текст программы.
/* +--------------------------------------------------------------+
Программа:
USER - Пользователь подключен к сети ?

Компилятор Borland C++ 3.1

+-------------------------------------------------------+ */
#include <conio>
#include <stdlib>
#include <string>
#include <stdio>
#include <ctype>
#include <io>
#include <dos>
#include "netware.h"



/* +---------------- M a i n -------------------------+ */

int main(int argc, char** argv)
{
int rc, nS;
word Ncon;
long UsID;
byte ConLst[100];
char User[48];
char ServTab[384];
char Server[16];
char *Ts;


if ( argc <2> 2) {
strcpy(Server, argv[2]);
GetFileServerTable(ServTab);
Ts = &ServTab[0];
for (nS = 1; (nS < 9) && *Ts; ++nS) {
if (stricmp(Server, Ts) == 0)
break;
Ts += 48;
}
if (*Ts)
SetPreferredConnectionID(nS);
else {
fprintf(stdout, "Неизвестный сервер %s\n", Server);
return(4);
}
}
if ((rc = GetBinderyObjectID(USER, User, &UsID)) != 0) {
fprintf(stdout, "Пользователя %s нет на сервере!\n", User);
return(3);
}
rc = GetObjectConnectionNumbers(USER, User, &Ncon, ConLst);
if (rc == 0) {
if (Ncon) {
fprintf(stdout, "Пользователь %s подключен!\n", User);
return(0);
}
else {
fprintf(stdout, "Пользователь %s НЕ подключен!\n", User);
return(2);
}
}
else
return(rc);

}
/* +--------------- Конец файла USER.C -----------------+ */
Andrew Pushkarev
 
Сообщения: 94
Зарегистрирован: 04 сен 2002, 16:08

Сообщение Dimerson » 17 окт 2008, 14:54

можно проанализровать код ошибки .
Аватара пользователя
Dimerson
 
Сообщения: 2966
Зарегистрирован: 15 сен 2002, 14:39
Откуда: Регион 70

Насколько я помню, в старом Bindery API

Сообщение Boris Morozov » 18 окт 2008, 01:22

под номер коннекта был 1 байт. Посему, если номер коннекта выходит за 255 получается фигня, причем это не лечится. Лечится только применением нормальных функций клиента Netware. А для этого у новелла куча и API и самплов на сайте. Пользуем много лет и никаких проблем. Особенно удобна библиотека Delphi_U. Все, что надо.
Правда из-за дебильности линкера винды приходится делать промежуточную DLL с динамическим вызовом, иначе модули на локальных станциях без клиента просто не грузятся. Но с помощью долота и какой-то матери можно обойти.
Boris Morozov
 
Сообщения: 1333
Зарегистрирован: 05 июн 2002, 22:24
Откуда: Минск

Сообщение Dimerson » 19 окт 2008, 19:11

Блин проворонил. Я ж с этим боролся было дело.

Так как наши горе-кодеры накодили горы прог с использованием старого NW API (Времен 2.15) где номер коннекта передавался в 8-битном регистре то со временем у них возникли дикие проблемы.

Я сделал резидента который всегда отдает маленкий номер коннекта и на него же верное UserName (NDS).

Биндеря умерла с NW312 и там никогда много коннектов не было.

то есть в батник перед щапуском проги прописывается резидент 100 байт.

все.

но слава богу вменяемые кодеры уже давно идут под win32 посему это уже доживает ... хотя еще лет 5 блин будет жить.
Аватара пользователя
Dimerson
 
Сообщения: 2966
Зарегистрирован: 15 сен 2002, 14:39
Откуда: Регион 70


Вернуться в Novell

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23