Зачем удалять имя NetBios, естественно для того, чтобы запретить обращаться по этому имени. А это может быть использовано для специфических операций, когда работа с программой нежелательна. То есть программа работает, но используя NetBios к ней не обратишься. Удаление имени NetBios производится командой NCBDELNAME. При этом нужно указать только NetBios имя программы, которая обращается и вызвать команду. Вот так это должно выглядеть.
NCB ncb; int i; memset(&ncb, 0, sizeof (ncb)); i_strlen = strlen(LOCALNAME); if (i_strlen > NCBNAMSZ) i_strlen = NCBNAMSZ; memset(ncb.nbc_name, ' ', NCBNAMSZ); memcpy(ncb.nbc_name, LOCALNAME, i_strlen); ncb.ncb_command=NCBDELNAME; uRetCode = Netbios((NCB*) &ncb );
В код проекта я внес некоторые изменения. Ну во-первых, сделал глобальной переменную NCB. В этом нет ничего плохого, всё равно memset её обнуляет. И это обязательно надо делать:
....... NCB ncb; .......
Во-вторых, объявил глобальную переменную uRetCode:
UCHAR uRetCode;
Теперь я могу создать функцию, которая будет тестировать возврат и не делать это каждый раз при вызове команд.
void TestNetBiosOperation() { if ( uRetCode != 0 ) { cout << "error " << endl; exit(1); } }
Так как NCB глобальная можно создать функцию, которая будет вызывать команду NetBios и сразу тестировать результат.
void RunNetBiosCommand(UCHAR ncb_command) { ncb.ncb_command=ncb_command; uRetCode = Netbios((NCB*) &ncb ); TestNetBiosOperation(); }
Так же я написал обещанную функцию GenerateNetBiosName.
void GenerateNetBiosName(unsigned char* chNetBiosName) { int i_strlen; i_strlen = strlen(LOCALNAME); if (i_strlen > NCBNAMSZ) i_strlen = NCBNAMSZ; memset(chNetBiosName, ' ', NCBNAMSZ); memcpy(chNetBiosName, LOCALNAME, i_strlen); }
И процедура удаления имеет теперь вид.
void DeleteNetBiosName() { memset (&ncb, 0, sizeof (ncb)); GenerateNetBiosName(ncb.ncb_name); RunNetBiosCommand(NCBDELNAME); }
А добавления:
void AddNetBiosName() { memset(&ncb, 0, sizeof (ncb)); GenerateNetBiosName(ncb.ncb_name); ncb.ncb_lana_num = LANANUM; RunNetBiosCommand(NCBADDNAME); }
Всё можете посмотреть загрузив проект. Но код намного читабельнее. Общий вид программы Вот:
void main() { ResetNetBios(); AddNetBiosName(); ViewNetBiosName(); DeleteNetBiosName(); cout << "Canсel" << endl; getch(); }
Теперь нужно всё проверить. Скомпилируйте и запустите эту программу, потом не прекращая её запустите из предыдущего примера. У Вас должно быть примерно так:
Как видите в отличии от предыдущего примера несмотря на то, что программа не закончила работу её имени уже нет.