mac address

Postby Antonio Linares » Sat Jul 19, 2008 12:13 am

Stefan,

This function is returning an empty array here on my computer.

I have three network adapters.

FWH GetNetCardID() is working fine here.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby StefanHaupt » Mon Jul 21, 2008 9:10 am

Antonio,

I think I found the reason why it´s sometimes working and sometimes not.

It seems to depend on the pc the app is compiled. Compiling it with my office pc (XP64) it only runs on this pc, on others it crashes without error log, only a system message that there is a problem with he app.

If I compile it on my home pc (xp32, Sp3) it working on verey other pc.

I nerver noticed this before, I have the same version, the same environment, it´s very curious.
kind regards
Stefan
StefanHaupt
 
Posts: 824
Joined: Thu Oct 13, 2005 7:39 am
Location: Germany

Postby StefanHaupt » Mon Jul 21, 2008 9:13 am

Antonio,

This function is returning an empty array here on my computer.

sorry, I forgot to insert these lines
Code: Select all  Expand view
  hb_arrayAdd(paAddress, pSubArray);
   hb_itemRelease(pSubArray);

before pAdapterInfo = pAdapterInfo->Next;. Now it´s working.

It returns the description, the mac address, it´s name and it´s type for every card.

here is an small sample
Code: Select all  Expand view
FUNCTION GetNetID3 ()

  LOCAL n
  LOCAL cDescription, cMac, cType, cName
  LOCAL aNic := GetMac ()

  if ValType (aNic ) == "A"
    for n := 1 TO Len (aNic)
      cDescription := aNic [n,1]
      cMac :=  aNic [n,2]
      cName := aNic [n,3]
      cType := cValToChar (aNic [n,4])

      IF cType = "6"
        MsgInfo( "Description: "+cDescription+CRLF+;
                 "Mac        : "+cMac+CRLF+;
                 "Name       : "+cName+CRLF+;
                 "Type       : "+cType,;
                 "NIC"  )
      endif
    next
  endif

RETURN (nil)


Only one problem remains, the description and the name are PWCHAR in the API-deklaration, with
hb_arraySet(pSubArray, 1, hb_itemPutC(pItem,( char *) pAdapterInfo->Description));
I get only the first char back. How can I convert this type into a PCHAR ?
kind regards
Stefan
StefanHaupt
 
Posts: 824
Joined: Thu Oct 13, 2005 7:39 am
Location: Germany

Postby Antonio Linares » Mon Jul 21, 2008 11:03 am

Stefan,

Use this FWH function:

char * WideToAnsi( LPWSTR );
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Antonio Linares » Mon Jul 21, 2008 11:07 am

Remember to use the memory that WideToAnsi() allocates:

char * pText = WideToAnsi( <wide_string> );

use pText ...

hb_xfree( pText );
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby StefanHaupt » Tue Jul 22, 2008 7:39 am

Thanks,

I added the following lines

Code: Select all  Expand view
char* pText;
    ......
    pText = HB_FUN_WIDETOANSI (pAdapterInfo->Description);
    hb_arraySet(pSubArray, 1, hb_itemPutC(pItem, pText));
    hb_xfree (pText);


on runtime I get

Unrecoverable error 9023:
hb_xgrab requested to allocate zero bytes

Did I forget something ?
kind regards
Stefan
StefanHaupt
 
Posts: 824
Joined: Thu Oct 13, 2005 7:39 am
Location: Germany

Postby StefanHaupt » Tue Jul 22, 2008 9:24 pm

Dear Antonio,

StefanHaupt wrote:It seems to depend on the pc the app is compiled. Compiling it with my office pc (XP64) it only runs on this pc, on others it crashes without error log, only a system message that there is a problem with he app.


Ok, finally I got it. :D

It depends on the version of iphlpapi.dll and the lib built from it. If I link this lib with my app it runs only on those pc´s with the same version of iphlpapi.dll the lib was build from. If I load the dll dynamically everything works fine on every tested pc.

Maybe the addresses of the functions in the dll differs from one version to another.

Antonio, did you test the function GetNetCardID() against this scenario ? I found this function does not cause an error, but it returns a wrong mac and does not find all nics.

Many thanks for your great support
:)
kind regards
Stefan
StefanHaupt
 
Posts: 824
Joined: Thu Oct 13, 2005 7:39 am
Location: Germany

Postby Antonio Linares » Fri Jul 25, 2008 12:44 am

Stefan,

>
pText = HB_FUN_WIDETOANSI (pAdapterInfo->Description);

on runtime I get

Unrecoverable error 9023:
hb_xgrab requested to allocate zero bytes
>

That means that pAdapterInfo->Description contains a zero length string, thats why hb_xgrab() fails when it is requested to allocate zero bytes.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Antonio Linares » Fri Jul 25, 2008 12:50 am

Stefan,

>
Maybe the addresses of the functions in the dll differs from one version to another.
>

Yes, thats possible. In those cases, the address of the used function should be obtained using GetProcAddress():

http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx

There are many examples in these forums using GetProcAddress().

>
did you test the function GetNetCardID() against this scenario ? I found this function does not cause an error, but it returns a wrong mac and does not find all nics.
>

FWH GETNETCARDID() is working fine on Vista (just uses Windows API GetAdaptersInfo(). Though Microsoft recommends to use GetAdaptersAddresses(), GetAdaptersInfo() seems ok for us):

http://msdn.microsoft.com/en-us/library/aa365917.aspx
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Previous

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 52 guests