C++ 関数をマップしました (WLanapi.dll から):
DWORD WINAPI WlanHostedNetworkQueryStatus(
_In_ HANDLE hClientHandle,
_Out_ PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus,
_Reserved_ PVOID pvReserved
);
次の C# コードに:
[DllImport("Wlanapi.dll", SetLastError = true)]
static extern UInt32 WlanHostedNetworkQueryStatus(
[In] IntPtr hClientHandle,
[Out] out _WLAN_HOSTED_NETWORK_STATUS ppWlanHostedNetworkStatus,
[In, Out] IntPtr pvReserved
);
また、必要なすべての構造体と列挙型、およびその他のものをマップしました (たとえば、clientHandle ポインターを取得し、ホストされたネットワークを開始するため)。
_WLAN_HOSTED_NETWORK_STATUS は次のようにマッピングされます。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct _WLAN_HOSTED_NETWORK_STATUS
{
public _WLAN_HOSTED_NETWORK_STATE HostedNetworkState;
public Guid IPDeviceID;
public _DOT11_MAC_ADDRESS wlanHostedNetworkBSSID;
public _DOT11_PHY_TYPE dot11PhyType;
public UInt32 ulChannelFrequency;
public UInt32 dwNumberOfPeers;
public _WLAN_HOSTED_NETWORK_PEER_STATE[] PeerList;
}
その関数を実行するとき、ppWlanHostedNetworkStatus を正しく使用する方法がわかりません。関数は ERROR_SUCCESS (0) を返します。これは、関数を呼び出してパラメーターを正しく渡したことを意味します。
_WLAN_HOSTED_NETWORK_STATUS netStatus = new _WLAN_HOSTED_NETWORK_STATUS();
WlanHostedNetworkQueryStatus(clientHandle, out netStatus, IntPtr.Zero);
しかし、値 (ネットワークの状態や接続されたピアの数など) について ppWlanHostedNetworkStatus を照会しているときに、いくつかの奇妙な長整数 (メモリ アドレスと言うでしょうが、よくわかりません) を取得しています。たとえば、次のように呼び出します。
netStatus.HostedNetworkState.ToString();
戻り値
11465720
HostedNetworkState は、次のように定義された列挙型です。
public enum _WLAN_HOSTED_NETWORK_STATE
{
wlan_hosted_network_unavailable,
wlan_hosted_network_idle,
wlan_hosted_network_active
}
.toString() は、列挙からこれらの文字列の 1 つを返す必要がありましたよね?
_WLAN_HOSTED_NETWORK_STATUS ( MS documentation ) のドキュメントでは、その関数を呼び出す前に、ppWlanHostedNetworkStatus は NULL である必要があり、それ自体が構造...
どうすればデバッグできますか? 私はC#、VS 2012でコーディングしています...
ご協力いただきありがとうございます。
-----EDIT-----
さらに、IntPtr を引数として関数をマップし、IntPtr.Zero と Marshal.PtrToStruct を渡しようとしましたが、それをしようとすると AccessViolationException が発生します...
[DllImport("Wlanapi.dll", SetLastError = true)]
static extern UInt32 WlanHostedNetworkQueryStatus(
[In] IntPtr hClientHandle,
[Out] out IntPtr ppWlanHostedNetworkStatus,
[In, Out] IntPtr pvReserved
);
その後:
IntPtr ppStatus = IntPtr.Zero;
WlanHostedNetworkQueryStatus(clientHandle, out ppStatus, IntPtr.Zero);
_WLAN_HOSTED_NETWORK_STATUS netStatus = (_WLAN_HOSTED_NETWORK_STATUS)Marshal.PtrToStructure(ppStatus, typeof(_WLAN_HOSTED_NETWORK_STATUS));
------編集2 -------
Fermat2357 からのアドバイスに従って、マップする構造体の一部のコメントを外し、ポインターからポインターをカウントするように以下を変更しました。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct _WLAN_HOSTED_NETWORK_STATUS
{
public _WLAN_HOSTED_NETWORK_STATE HostedNetworkState;
public Guid IPDeviceID;
public _DOT11_MAC_ADDRESS wlanHostedNetworkBSSID;
public _DOT11_PHY_TYPE dot11PhyType;
public UInt32 ulChannelFrequency;
public UInt32 dwNumberOfPeers;
//public _WLAN_HOSTED_NETWORK_PEER_STATE[] PeerList;
}
私はそれを次のように呼びます:
IntPtr ppStatus = IntPtr.Zero;
WlanHostedNetworkQueryStatus(clientHandle, out ppStatus, IntPtr.Zero);
IntPtr ppStatus2 = new IntPtr(ppStatus.ToInt32());
_WLAN_HOSTED_NETWORK_STATUS stat = (_WLAN_HOSTED_NETWORK_STATUS)Marshal.PtrToStructure(ppStatus2, typeof(_WLAN_HOSTED_NETWORK_STATUS));
netStatus = stat.HostedNetworkState.ToString();
これにより、最終的に正しいネットワークステータスが得られます(開始後にアクティブになります)...今、その動的配列をマーシャリングする方法を見つけなければなりません...
これまでのところ、助けてくれてありがとうFermat2357