2011-04-14 67 views
0

C++函數頭在DLL這兩函數來獲取關於使用贏得Mobile 6.5的設備我周圍的WiFi站的一些信息C++ DLL,我需要調用它們在C#代碼中使用它們PInvoke的C#使用的DllImport在C#

// (adapter names , pointer to destination buffer ,and the size , returned structs) 
bool __declspec(dllexport) GetBBSIDs(LPWSTR pAdapter, struct BSSIDInfo *pDest, DWORD &dwBufSizeBytes, DWORD &dwReturnedItems); 
bool __declspec(dllexport) RefreshBSSIDs(LPWSTR pAdapter); 
bool __declspec(dllexport) GetAdapters(LPWSTR pDest, DWORD &dwBufSizeBytes); 

C#示例

[DllImport(@"\Storage Card\Work\Beaad.dll", EntryPoint = "GetAdapters", SetLastError = true)] 
public static extern bool getAdapters([MarshalAs(UnmanagedType.LPWStr)] String buf, ref UInt32 dwBufSizeBytes); 

[DllImport(@"\Storage Card\Work\Beaad.dll", EntryPoint = "RefreshBSSIDs", SetLastError = true)] 
public static extern bool refreshBSSIDs([MarshalAs(UnmanagedType.LPWStr)]String buf); 

[DllImport(@"\Storage Card\Work\Beaad.dll", EntryPoint = "GetBBSIDs", SetLastError = true)] 
public static extern bool getBBSIDs([MarshalAs(UnmanagedType.LPWStr)]String buf,BSSIDInfo [] nfo, ref UInt32 dwBufSizeBytes, ref UInt32 dwReturnedItems); 

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)] 
public struct BSSIDInfo 
{ 
    public byte[] BSSID; //mac 
    public char[] SSID; 

    public BSSIDInfo(byte[]bs,char[] ss) 
    { 
     this.RSSI = 0; 
     this.Infastructure = 0; 
     this.Channel = 0; 
     this.Auth = 0; 
     bs = new byte[6]; 
     ss = new char[32]; 
     BSSID = bs; 
     SSID = ss; 
    } 
    public int RSSI; 
    public int Channel; 
    public int Infastructure; 
    public int Auth; 
} 

public static byte[] StrToByteArray(string str) 
{ 
    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
    return encoding.GetBytes(str); 
} 
public static char[] c = new char[1024]; 
string buf = new string(c); 
public void button1_Click(object sender, EventArgs e) 
{ 
    BSSIDInfo[] nfo = new BSSIDInfo[128]; 
    byte[] bytee=StrToByteArray(buf); 
    UInt32 dwsize= new UInt32(); 
    UInt32 dwTmp = new UInt32(); 
    UInt32 dwCount = new UInt32(); 
    dwTmp = Convert.ToUInt32(Marshal.SizeOf(typeof(BSSIDInfo)) * nfo.Length); 
    dwCount =0; 
    dwsize=Convert.ToUInt32(bytee.Length); 
    if (false == getAdapters(buf,ref dwsize) || dwsize == 0) 
    { 
     label1.Text = "no adabters"; 
    } 
    else 
    { 
     String [] strList=new String[15];  
     if (buf.Contains(',') == false)// one adapter 
     { 
      textBox1.Text = buf; 
     } 
     else 
     { 
      strList = buf.Split(','); 
      for (int i = 0; i < strList.Length; i++) 
      { 
       textBox1.Text+= strList[i]+Environment.NewLine; 
      } 
     } 
     if (refreshBSSIDs(buf) && getBBSIDs(buf, nfo, ref dwTmp, ref dwCount) && dwCount > 0) 
     { 
      //refreshBSSIDs(buf) && 
      for (int i = 0; i < dwCount; i++) 
      { 
       textBox2.Text += nfo.GetValue(i).ToString() + Environment.NewLine; 
      } 
     } 
     else 
     { 
      //make another thing 
     } 
    } 
} 

,當我把這個DLL在移動和C#APP.EXE是命名爲Getadapters(..)第一回給我的適配器的名稱的第一個函數textbox1則應用程序停止,並在移動設備嘗試執行時給予我不支持的異常e另一個名爲refreshBSSID()和getBSSIDs()的函數有什麼問題?還是有另一種解決方案來獲取這些信息(BSSID,SS ..等等)?

回答

0

默認情況下爲C++,除非更改使用調用方(Cdecl)調用約定。您的C++代碼不會更改調用約定。默認情況下你的C#代碼(除非你改變它)將使用被調用者約定(StdCall)。

雖然這可能不是完全問題,但它仍然是技術上不正確的。即使你要解決目前的問題,由於調用約定,你可能最終會遇到問題。

我打算猜測你的C#BSSIDInfo結構與C++結構不匹配。爲什麼當它是所有給定的字符串GetBytes會的方法StrToByteArray ...

當移動嘗試執行 另外兩個函數命名爲 refreshBSSID()和getBSSIDs()等什麼 是問題 ?或者是否有另一個 解決方案來獲取此信息

我以爲我知道原因採取了另一種看法,我錯了。

+0

我會說點什麼...主要是使用StrToByte函數的第一個函數執行得很好..現在問題在第二個函數中 – 2011-04-15 01:17:10