摘要:VB6的2維陣列轉成C#的2維陣列
最近在使用1隻廠商提供的DLL(用C++寫的原生DLL)
沒有header只有dll跟VB6的範例,在使用其中一個function時,發現怎麼結果跟vb6的都不一致
即使是輸入的值跟參數都一樣,但回傳的結果怎麼都不一樣。
這個問題困擾了我1天半,天呀,時間緊迫,光1個function就浪費我1天半,我情何以堪。
最後經測試後發現,原來是vb6與c#的二維陣列的宣告方式跟本就不一樣。
VB6中的function宣告
Declare Sub cDSP1LineGraph Lib "kotech3DLL.dll" (ByRef src As Byte, ByRef param&, ByRef dest As Long, ByVal scw As Long, ByVal wnw As Long, ByVal t As Long)
VB6中的使用
Dim W, X As Long
Dim param(9) As Long
Dim byteArray() As Byte
Dim intResult() As Long
W = 1000
ReDim byteArray(W - 1, 2)
ReDim intResult(W)
For X = 0 To W - 1
If (X >= (W / 2 - 1) And X <= (W / 2 + 1)) Then
byteArray(X, 0) = 100
byteArray(X, 1) = 100
byteArray(X, 2) = 100
End If
Next X
param(0) = 0
param(1) = W - 1
param(2) = 0
param(3) = 0
param(4) = 125000
param(5) = -param(4)
param(6) = 0
param(7) = 0
param(8) = 2000000000
param(9) = 2000000000
cDSP1LineGraph byteArray(0, 0), param(0), intResult(0), W, W, 65
==================================================================
C#中的宣告
[DllImport(DllName, CharSet = CharSet.Auto, EntryPoint = "cDSP1LineGraph")] public static extern void cDSP1LineGraph(byte[,] src, int[] param, int[] dest, int scw, int wnw, int t);
C#中的使用
int w = 1000; byte[,] byteArray = new byte[3 ,w]; for (int x = 0; x < w; x++) { if(x >=(w/2 -1) && x <= (w/2 +1)) { byteArray[0, x] = (byte)(100); byteArray[1, x] = (byte)(100); byteArray[2 ,x] = (byte)(100); } } int[] param = new int[10]; param[0] = 0; param[1] = w - 1; param[2] = 0; param[3] = 0; param[4] = 125000; param[5] = -param[4]; param[6] = 0; param[7] = 0; param[8] = 2000000000; param[9] = 2000000000; int[] intResult = new int[w+1]; cDSP1LineGraph(byteArray, param, intResult, w, w, 65); 注意VB6及C#程式碼中的2維陣列的差異 從沒寫過VB的我, 這個差異,弄了我一天半。以後不要再叫我弄這種不同語言的東西了啦。 頭好痛。
============ 以下是簽名檔 ============
一個小小螺絲釘。
第一次建立Blog,希望以後能慢慢充實它。
Howard