2014-11-06 41 views
2

我一直在瀏覽本網站很長一段時間&感謝您對其他人的問題的答案 - 現在,唉,我必須透露我的通過問我自己的一個無知。我搜索了一個現有的等價物但找不到一個;如果這是重複的,我很抱歉。C++到C#的包裝 - 如何處理來自C#的雙指針數組

我試圖從.NET 4.0框架下的Visual C#Winforms應用程序使用非託管Windows DLL(英特爾電源小工具3.0 API,FWIW)。這個API是在C++實現的基礎上編寫的,所以我不得不隨時翻譯。我已經能夠來包裝和實施圖書館的功能,但我通過這一個狼狽不堪:

bool GetPowerData(int iNode, int iMSR, double *pResult, int *nResult); 

...這是由作家這樣(我的重點)描述:

將最近一次調用收集到的數據返回給ReadSample()。 返回的數據用於由iNode指定的MSR指定的包中的數據, 。 數據在pResult中返回, 在 nResult中返回pResult中返回的雙重結果的數量。請參閱表1:MSR功能。

https://software.intel.com/en-us/blogs/2014/01/07/using-the-intel-power-gadget-30-api-on-windows

關鍵點:功能中的指針double數組的形式返回其主數據 - 或者是指針double數組? ...什麼程度的間接?這就是我開始不確定的地方! :)

至少一些的輸入參數很簡單; iNodeiMSRint s,這是我知道並已經可以獲得的價值。

我已經聲明與此簽名在我的C#代碼的功能:

[DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)] 
    static extern bool GetPowerData(int iNode, int iMSR, out IntPtr pResult, ref int nResult); 

(我敢肯定,這是我的第一個錯誤,就在那裏)

至於實際調用的函數,我已經嘗試了各種可能性,甚至在這裏都顯得很醜。

能否有人比我的知識更多請提出處理此函數及其返回值的最佳方法?

預先感謝您。

+0

指針和數組在C++中幾乎是相同的。這就是爲什麼雙精度數組返回爲double *的原因。看看http://www.cplusplus.com/doc/tutorial/pointers/#arrays。 – rsenna 2014-11-06 18:51:55

+1

感謝rsenna爲您的快速和有益的迴應。你鏈接到的文章是我見過的C++中更好的數組解釋之一。不幸的是,你認爲我比這更容易理解,事實上 - 我會繼續研究:) – 2014-11-06 20:15:37

+0

不客氣! :)那是我當時可以提供的最好的,希望它有所幫助。 – rsenna 2014-11-07 15:38:58

回答

5

該文檔尚不清楚。由於這是一個要填充多個結果的double *,您需要通過預分配的數組 - 但該數組應該多大?所述doc說以下內容:

的MSR的功能,其中所述API從GetMsrFunc(獲得),確定數據的量和從含義返回GetPowerData(),如表1中所述。

而且在表1我們看到:

  • MSR 0:1雙。
  • MSR 1:3雙打。
  • MSR 2:2雙打。
  • MSR 3:1 double。

因此,一個3雙打的數組應該足以容納所有可能的返回數據。這是由不

 for (int j = 0; j < numMsrs; j++) 
     { 
      int funcID; 
      energyLib.GetMsrFunc(j, &funcID); 
      double data[3]; 
      int nData; 
      wchar_t szName[MAX_PATH]; 

      energyLib.GetPowerData(currentNode, j, data, &nData); 
      energyLib.GetMsrName(j, szName); 

所以sample c++ source證明了這一點,你將宣佈它像:

[DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)] 
    static extern bool GetPowerData(int iNode, int iMSR, [In, Out] double [] pResult, out int nResult); 

,並呼籲它,使用

double [] result = new double[3]; 

爲討論,請參閱here將數組傳遞給非託管代碼。

(注 - 回答沒有測試。)

+1

謝謝。這工作完美,我現在可以通過GetPowerData()調用獲取值。我非常感謝你清晰明瞭的解釋! – 2014-11-07 23:33:03

0

正確答案(在這個意義上,它爲我工作 - 因人而異 - 被張貼DBC,及時和清晰 這是我使用的基礎上。 DBC的評論:

聲明:

[DllImport("EnergyLib64.dll", CallingConvention = CallingConvention.Cdecl)] 
    static extern bool GetPowerData(int iNode, int iMSR, [In, Out] double[] pResult, out int nResult); 

與用法:

double[] result = new double[4]; 
.... 
bResult = GetPowerData(0, iModeLocal, result, out nResult); // where iModeLocal is an integer that determines the type of data (MSR) I'm interested in 

我很久以前沒有把這個標記爲「回答」的唯一原因是我沒有意識到我沒有。哎呦。抱歉。