Using WZCEnumInterfaces using interop in C#

A

Abhi

Hi,

I am trying to use the native WinCE API WZCEnumInterfaces using
interop in C# .NET compact framework. I have to develop this without
the OpenNetCF wrapper. But whenever I call the function, I get the
exception "System.NotSupportedException". I looked at the help page
for this exception and I think I have taken care of all the possible
causes for the exception. Could anyone please let me know anything
that I could be doing wrong. Please find my code below:

[StructLayout(LayoutKind.Sequential)]
struct INTF_KEY_ENTRY
{
[MarshalAs(UnmanagedType.LPWStr)]
public string wszGuid;
}

[StructLayout(LayoutKind.Sequential)]
struct INTFS_KEY_TABLE
{
public uint dwNumIntfs;

public IntPtr pIntfs; //This is a pointer to
INTF_KEY_ENTRY in the native c++
}

[DllImport("wzcsapi.dll", SetLastError = true)]
private static extern ulong WZCEnumInterfaces(string pSrvAddr,
ref INTFS_KEY_TABLE pIntfs);

/// <summary>
/// find the first wireless network cards
/// </summary>
public void GetFirstWirelessNetworkCard()
{
INTFS_KEY_TABLE IntfsTable = new
INTFS_KEY_TABLE();
IntfsTable.dwNumIntfs = 0;

IntfsTable.pIntfs =
Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)) *
(int)IntfsTable.dwNumIntfs);

ulong dwStatus = 0;

try
{
dwStatus = WZCEnumInterfaces(null , ref IntfsTable);
}
catch(Exception e)
{
int errorNum = Marshal.GetLastWin32Error();

MessageBox.Show(e.Message + " Error: " + errorNum,
"Fatal Error!");
return;
}
}
 
A

Abhi

Now I have made the following changes to the initial declarations in
my function. But I am still getting the same error.

INTFS_KEY_TABLE IntfsTable = new INTFS_KEY_TABLE();
INTF_KEY_ENTRY IntfsEntry = new INTF_KEY_ENTRY();

IntfsEntry.wszGuid = string.Empty;

IntfsTable.dwNumIntfs = 0;
IntfsTable.pIntfs =
Marshal.AllocHGlobal(Marshal.SizeOf(IntfsEntry));
Marshal.StructureToPtr(IntfsEntry, IntfsTable.pIntfs,
false);
 
C

Chris Tacke, MVP

So why exactly are you wasting time doing this and not using OpenNETCF's
implementation? It comes with full source if you buy the extensions, and it
seems to me that if you've spent more than 30 minutes already trying to get
this working, then it's worth the $50 to just purchase it.

-Chris
 
A

Abhi

The problem was that I had the return type of the function as a 64-bit
ulong. When I tried 32-bit uint, it worked.

Also I downloaded the opennetcf libraries like you suggested.

Thanks,
Abhi

So why exactly are you wasting time doing this and not using OpenNETCF's
implementation?  It comes with full source if you buy the extensions, and it
seems to me that if you've spent more than 30 minutes already trying to get
this working, then it's worth the $50 to just purchase it.

-Chris


I am trying to use the native WinCE API WZCEnumInterfaces using
interop in C# .NET compact framework. I have to develop this without
the  OpenNetCF wrapper. But whenever I call the function, I get the
exception "System.NotSupportedException". I looked at the help page
for this exception and I think I have taken care of all the possible
causes for the exception. Could anyone please let me know anything
that I could be doing wrong. Please find my code below:
           [StructLayout(LayoutKind.Sequential)]
       struct INTF_KEY_ENTRY
       {
           [MarshalAs(UnmanagedType.LPWStr)]
           public string wszGuid;
       }
       [StructLayout(LayoutKind.Sequential)]
       struct INTFS_KEY_TABLE
       {
           public uint dwNumIntfs;
           public IntPtr pIntfs; //This is a pointer to
INTF_KEY_ENTRY in the native c++
       }
       [DllImport("wzcsapi.dll", SetLastError = true)]
       private static extern ulong WZCEnumInterfaces(string pSrvAddr,
ref INTFS_KEY_TABLE pIntfs);
       /// <summary>
       /// find the first wireless network cards
       /// </summary>
       public void GetFirstWirelessNetworkCard()
       {
           INTFS_KEY_TABLE IntfsTable = new
INTFS_KEY_TABLE();
           IntfsTable.dwNumIntfs = 0;
           IntfsTable.pIntfs =
Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)) *
(int)IntfsTable.dwNumIntfs);
           ulong dwStatus = 0;
           try
           {
               dwStatus = WZCEnumInterfaces(null , refIntfsTable);
           }
           catch(Exception e)
           {
               int errorNum = Marshal.GetLastWin32Error();
               MessageBox.Show(e.Message + " Error: " + errorNum,
"Fatal Error!");
               return;
           }
     }
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top