[ mvlado @ 18.05.2003. 19:01 ] @
Ovaj kod izlista u jednom texbox-u UserName i IP broj svih
korsinika koji su logovani na taj racunar.

Potrebno mi je da se od ovog koda napravi dll fajl, kako bi mogao
da ga koristim u VB,
sa jednom funkciom koja bi se zvala npr.

GetAllUsers (UserNo, Users)

i koja bi vracala dva parametra,
1) Broj korisnika
2) Pokazivac na Niz recorda u obliku
UserName as String
Ip as String

Pogledati ovaj text: Handling VB strings (as part of an array of UDT)
http://www.codeguru.com/dll/vbString.shtml

Ako neko ima bolje resenje neka uradi kako misli da treba
pa naka detaljno opise resenje.

Nebi bilo lose da neko malo detaljnije prokomentarise ovaj kod.

Kompletan projekat se moze skinuti sa ove adrese:
www.codeguru.com/network/IPAddress.zip

Kod:

1) Include winsock2.h

2) In the Menu, go to Project-->Settings and in the Link tab,
you can see a text box named Object/Library Modules.
In that, add ws2_32.lib mpr.lib to the existing entries there.
Those 2 libraries have to be added for this code snippet to
compile without any linker errors.


CString strTemp;
struct hostent *host;
struct in_addr *ptr; // To retrieve the IP Address

DWORD dwScope = RESOURCE_CONTEXT;
NETRESOURCE *NetResource = NULL;
HANDLE hEnum;
WNetOpenEnum( dwScope, NULL, NULL, NULL, &hEnum );

WSADATA wsaData;
WSAStartup(MAKEWORD(1,1),&wsaData);

if ( hEnum )
{
DWORD Count = 0xFFFFFFFF;
DWORD BufferSize = 2048;
LPVOID Buffer = new char[2048];
WNetEnumResource( hEnum, &Count, Buffer, &BufferSize );
NetResource = (NETRESOURCE*)Buffer;

char szHostName[200];

for ( unsigned int i = 0; i < BufferSize/sizeof(NETRESOURCE);
i++, NetResource++ )
{
if ( NetResource->dwUsage == RESOURCEUSAGE_CONTAINER &&
NetResource->dwType == RESOURCETYPE_ANY )
{
if ( NetResource->lpRemoteName )
{
CString strFullName = NetResource->lpRemoteName;
if ( 0 == strFullName.Left(2).Compare("\\\\") )
strFullName = strFullName.Right(strFullName.GetLength()-2);
gethostname( szHostName, strlen( szHostName ) );
host = gethostbyname(strFullName);
if(host == NULL) continue;
ptr = (struct in_addr *) host->h_addr_list[0];

// Eg. 211.40.35.76 split up like this.
int a = ptr->S_un.S_un_b.s_b1; // 211
int b = ptr->S_un.S_un_b.s_b2; // 40
int c = ptr->S_un.S_un_b.s_b3; // 35
int d = ptr->S_un.S_un_b.s_b4; // 76

strTemp.Format("%s --> %d.%d.%d.%d",strFullName,a,b,c,d);
AfxMessageBox(strTemp);
}
}
}
delete Buffer;
WNetCloseEnum( hEnum );
}

WSACleanup();

// End of Code
[ leka @ 22.05.2003. 11:09 ] @
Ne lista u jednom text box-u, vec koliko ja "kapiram" C/C++ kod ovo ce prikazati message box-ove, jedan po jedan redom...
[ Jovan Marjanovic @ 22.05.2003. 11:23 ] @
pogledaj temu : "dll-ovi... parametri funkcije" gde sam upravo napisao par primera za pisanje dll-a i mapiranje funkcije iz dll-a. Naravno, ako ces koristiti VB, onda zaboravi na prvi primer, ali drugi ti pokazuje kao da pravilno eksportujes funkciju iz dlla.
Sto se tice tvog koda, najbolje da sve podatke pakujes u pointer na array, i da tvoja funkcija to sve lepo vrati programu koji je poziva, i da odatle u VB-u preparsas taj array, i stavis sve podatke u neki text box, ili sta god hoces.
[ leka @ 26.05.2003. 19:25 ] @
Naravno, nas dragi mvlada je jedan od onih "gotovana" koji vole da im se sve servira, pa evo:
http://www.eee.bham.ac.uk/collinst/VisualBasic-VisualC-DLL.html

P.S. jedan GOOGLE search je dao ovaj link medju prvima - string koji sam trazio je dll c++ visual basic source