1、VC9: LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
原因之一:工程中包含的資源檔不在當前的工程目錄中
解決辦法:檢測資源檔是否有效,無效則將之刪除,OK,問題解決。
2、出現大量錯誤,未識別的“INT”類型,未以“;”結尾等等
原因之一:未包含windows.h檔案
解決辦法:在普通標頭檔之前包含windows.h檔案,OK,問題解決
3、Command line warning D9028 : minimal rebuild failure, reverting to normal build cl(最小重建失敗,正在轉換為標準產生)
原因之一:項目 .idb 檔案已損壞
解決方案:刪除.idb檔案並重建,在Debug目錄中把.idb檔案刪掉,OK,問題解決
4、未處理BadImageFormatException 試圖載入格式不正確的程式。 (異常來自 HRESULT:0x8007000B)
原因之一:該API是在32位系統下面開發的,在64位系統上面開發編譯的時候需要將產生的目標平台設為X86。
解決方案:在右邊的“方案總管”裡,右鍵該項目點擊屬性。在屬性視窗裡選擇“產生”——“目標平台”下拉裡選中“X86"即可。見:
5、C++ Dll回調C#方法,Dll中要將位元組數組傳遞給回調方法,結果訊息處理函數中只接收到一個位元組
原因之一:C++的回呼函數中有一個參數,是處理接收到的位元組流的回呼函數指標,定義基本如下:
typedef void (*fpDataReceived)(char *data ,int len);
其中char *data是從DLL中返回的位元組流,空間已經在DLL中分配了。
下面是在C#中定義的委託
public delegate void OnDataReceived(byte[] data, int len);
下面是C#中回呼函數的實現
public void getData(byte[] data, int len)
{
//結果這裡data的維數只有1,也就是說只收到一個位元組。
}
解決方案:1、using System.Runtime.InteropServices;
2、按如下方式定義委託:
public delegate void OnDataReceived(IntPtr pData , int len); //pData是個指標地址,對應上面的char*指標data
3、回呼函數的實現如下:
public void getData(IntPtr pData , int len)
{
byte[] data = new byte[len];
Marshal.Copy(pData, data, 0, len);
//接著處理 data 裡的內容
}