Страница 1 из 1

GetBinderyObjectID

СообщениеДобавлено: 17 окт 2008, 13:48
Andrew Pushkarev
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 -----------------+ */

СообщениеДобавлено: 17 окт 2008, 14:54
Dimerson
можно проанализровать код ошибки .

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

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

СообщениеДобавлено: 19 окт 2008, 19:11
Dimerson
Блин проворонил. Я ж с этим боролся было дело.

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

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

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

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

все.

но слава богу вменяемые кодеры уже давно идут под win32 посему это уже доживает ... хотя еще лет 5 блин будет жить.