各位大俠,小弟由于某些原因需要使用 VB.NET 呼叫一個標準C 的 DLL,以下是該函式的描述級呼叫,我該如何翻譯成VB的呢?
定義:
int32 s7_get_multiple_read_cnf(
void *od_ptr, /* In call */
ord16 *result_array, /* Returned */
ord16 *var_length_array, /* Call and Returned */
void *value_array /* Returned */
)
一個可運行的 C 程式例子:
static void my_get_multiple_read_cnf(ord32 cp_descr)
{ int32 ret;
ord16 result[2],var_length[2];
ord8 data_buffer[4]; /* four Byte are necessary for reading two MWORD */
ord8 *value_ptr[2];
/* initialize arrays */
result[0] = S7_RESULT_OBJ_NOT_EXISTS;
result[1] = S7_RESULT_OBJ_NOT_EXISTS;
var_length[0] = 2;
var_length[1] = 2;
value_ptr[0] = &data_buffer[0]; /* set first pointer to begin of buffer */ /問題點
value_ptr[1] = &data_buffer[2]; /* set sec. pointer to offset 2 */ /問題點
if((ret=s7_get_multiple_read_cnf(NULL,result,var_length,value_ptr))!=S7_OK)
{
my_exit(cp_descr,"Error s7_get_multiple_read_cnf",ret);
}
}
問題來了,實際上 value_ptr的第0和第1個元素分別存的是 data_buffer[0] 和 data_buffer[2]的地址,然后將value_ptr作為引數傳送給 DLL 中,但是我試了不是報錯就是回傳值 Value_ptr 中只有一個值。VB.net中該如何處理呢??重分相贈,各位大俠快來呀~~
uj5u.com熱心網友回復:
坐等大俠出現


uj5u.com熱心網友回復:
大神來幫忙呀。。。。。uj5u.com熱心網友回復:
求大神幫忙

uj5u.com熱心網友回復:
這樣古怪的引數定義作為API定義真沒見過。太惡心了!參考下面的代碼,但是不要直接用該函式(因為里面已經呼叫了Free()了)。
里面的e對應data_buffer的成員(有兩個資料就需要兩個GCHandle ,里面的GC2就是放到value_ptr中的成員。
記得要呼叫API之后,再呼叫Free()。
Public Function VarPtr(ByVal e As Object) As Integer
Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
GC.Free()
Return GC2
End Function
uj5u.com熱心網友回復:
這個方法我試了,由于 value_ptr是 byte型別的,呼叫時會報錯,我現在的做法是直接呼叫 MSVBVM60中的 VarPtr 函式,之后用copymemory 拷貝到value_ptr中,但是還是只回傳一個值, value_ptr在宣告時是用byref還是byval呢? byref的話就回傳一個值,byval則報不可訪問受保護記憶體。。
uj5u.com熱心網友回復:
你要 WORD 資料,所以 data_buffer 定義為 Short 型別。把 value_ptr 陣列也用 GCHandle.Alloc 的方式釘起來試試。應該是 ByVal 吧。
uj5u.com熱心網友回復:
我是需要 byte型別的 ,我去試試uj5u.com熱心網友回復:

你 C 代碼能回傳正確結果?
s7_get_multiple_read_cnf(NULL,result,var_length,value_ptr) 怎么知道陣列成員是2個而不是其它數量?
C 里面的指標陣列沒有個數資訊,你又沒有在陣列成員中添加結束標志。
uj5u.com熱心網友回復:
如果執行成功 result_array 會回傳 255 var_length_array會回傳長度,現在每次都回傳 1
我試了一下 如果用 value_array(0=)GC.AddOfPinnedObject.Toint32
會報運算錯誤,因為左邊是byte型別,而右邊是int32 怎么處理呢?
uj5u.com熱心網友回復:
ord8 是 8 位?甚至比近指標(16位)還短,根本不能在指向外部記憶體啊。
我認為你的 C 代碼呼叫根本沒有在 data_buffer 中得到正確的資料。
請仔細閱讀介面檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/81883.html
標籤:API
上一篇:求VBA 批量對比資料
下一篇:關于金蝶K3的二次開發
