2013-05-11 143 views
0

我想轉換一個C#代碼,它與DLL一起工作到C++,所以我的C++應用程序可以使用DLL。所以我在這裏開發一個C++/CLI應用C++/cli:無法轉換參數1

請看看下面的C#代碼

private void SendUSBData(byte[] Data) 
{ 
    if (this.USB.SpecifiedDevice != null) 
    { 
     this.USB.SpecifiedDevice.SendData(Data); 
    } 
} 

SendData()是在DLL中可用的方法。以下是它在DLL中定義

public void SendData(byte[] data); 

好了,現在在我的C++代碼,我試圖轉換C#這樣的代碼

void MissileLauncher::sendUSBData(unsigned char *data) 
{ 
    if(usb.SpecifiedDevice!=nullptr) 
    { 
     //System::Byte 
     usb.SpecifiedDevice->SendData(&data); 
    } 
} 

我收到以下錯誤,當我運行這段代碼

1>------ Build started: Project: CallToCSharp, Configuration: Debug Win32 ------ 
1> MissileLauncher.cpp 
1>MissileLauncher.cpp(200): error C2664: 'UsbLibrary::SpecifiedDevice::SendData' : cannot convert parameter 1 from 'unsigned char **' to 'cli::array<Type,dimension> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char, 
1>    dimension=1 
1>   ] 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

我嘗試以下以及

void MissileLauncher::sendUSBData(array<System::Byte>^data) 
{ 
    if(usb.SpecifiedDevice!=nullptr) 
    { 
     //System::Byte 
     usb.SpecifiedDevice->SendData(&data); 
    } 
} 

它給了我下面的錯誤

1>------ Build started: Project: CallToCSharp, Configuration: Debug Win32 ------ 
1> MissileLauncher.cpp 
1>MissileLauncher.cpp(125): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
1>MissileLauncher.cpp(159): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
1>MissileLauncher.cpp(164): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
1>MissileLauncher.cpp(166): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
1>MissileLauncher.cpp(186): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
1>MissileLauncher.cpp(188): error C2664: 'MissileLauncher::sendUSBData' : cannot convert parameter 1 from 'unsigned char *' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
1>MissileLauncher.cpp(200): error C2664: 'UsbLibrary::SpecifiedDevice::SendData' : cannot convert parameter 1 from 'cli::array<Type> ^*' to 'cli::array<Type> ^' 
1>   with 
1>   [ 
1>    Type=unsigned char 
1>   ] 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

我怎樣才能擺脫呢?有任何想法嗎?

更新作爲一個答案提出

,嘗試下面的代碼

void MissileLauncher::sendUSBData(unsigned char *data) 
{ 
    if(usb.SpecifiedDevice!=nullptr) 
    { 
     int N = 10; 
      cli::array<char>^ newData = gcnew cli::array<char>(N); 

     for (int i = 0; i < N; ++i) 
      newData[i] = data[i]; 

     //System::Byte 
     usb.SpecifiedDevice->SendData(newData); 
    } 
} 

現在,它給我下面的錯誤

1>------ Build started: Project: CallToCSharp, Configuration: Debug Win32 ------ 
1> MissileLauncher.cpp 
1>MissileLauncher.cpp(206): error C2664: 'UsbLibrary::SpecifiedDevice::SendData' : cannot convert parameter 1 from 'cli::array<Type> ^' to 'cli::array<Type,dimension> ^' 
1>   with 
1>   [ 
1>    Type=char 
1>   ] 
1>   and 
1>   [ 
1>    Type=unsigned char, 
1>    dimension=1 
1>   ] 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

說實話,我真的不知道是否按照建議正確編碼了這段代碼。如果不是,那麼請糾正我。請幫忙!

+0

不會啓動編輯戰爭,但沒有任何理由來添加標籤回稱號。不需要重複你已經有的東西。 – mwerschy 2013-05-11 19:41:00

回答

1

您需要將您的數據從char*轉換爲cli::array<char>^cli::array模板是在C++/CLI中實現System::Array的模板。要做到這一點,你需要知道數據的長度:

int N = /* length of data */ 
cli::array<System::Byte>^ newData = gcnew cli::array<System::Byte>(N); 
for (int i = 0; i < N; ++i) 
    newData[i] = data[i]; 
+0

非常感謝您的回覆。我想這是應該進入方法的代碼。所以,我可以請你知道你指的是哪種方法?在我的C++代碼中,我已經展示了2種不同的嘗試,使用了2種不同的方法樣式,這就是爲什麼 – 2013-05-11 19:45:46

+0

你在哪裏轉換到'cli :: array'並不重要,而是你遵循'UsbLibrary :: SpecifiedDevice :: SendData'。這個函數需要'cli :: array ^'參數,所以你需要傳遞轉換後的數據作爲它的參數。 – user2093113 2013-05-11 19:50:42

+0

請親切看看編輯的代碼。如果我做錯了什麼,請糾正我。 – 2013-05-11 19:56:41

0

你的第二個版本幾乎是正確的。這是一個問題:

void MissileLauncher::sendUSBData(array<System::Byte>^data) 
{ 
    if(usb.SpecifiedDevice!=nullptr) 
    { 
     //System::Byte 
     usb.SpecifiedDevice->SendData(&data); 
    } 
} 

而這裏的修復:

 usb.SpecifiedDevice->SendData(/* & <- take that out */ data); 
+0

我很抱歉,但它給了同樣的錯誤:(. – 2013-05-11 19:55:58

+0

@Knight:你有沒有拿出'&'就像我的回答說的那樣?還有,我已經複製了你的第一個版本,而不是你的第二個版本,我正在修復你的第二個版本。 – 2013-05-11 21:16:44

相關問題