將其它型別的資訊傳遞到 DLL 過程

2021-09-16 22:40:42 字數 2485 閱讀 4447

visual basic 支援的資料型別是相當豐富的,某些動態鏈結庫中的過程不能全部支援這些型別。在將 visual basic 變數用於 dll 過程時,可能會遇到一些特殊情況,下面將對此進行解釋。

傳遞 null 指標

某些 dll 過程希望接收到的引數為字串或 null 值,如果需要將 null 指標傳遞到字串引數,需要將引數宣告為 as string,並傳遞常數 vbnullstring。

例如,findwindow 過程能夠確定系統中是否有另外的應用程式正在執行。它需要兩個字串引數,乙個表示應用程式的類名,另乙個表示視窗的標題欄:

declare function findwindow lib "user32" alias _

"findwindowa" (byval lpclassname as string, _

byval lpwindowname as string) as long

這兩個引數都可以傳遞 null 值。而傳遞零長度的字串 ("") 將不起作用,因為這將傳遞指向零長度字串的指標。該指標的值不會是 0。可以用實際值 0 來作為引數傳遞。為了保證引數的正確性,最簡單的辦法是使用常數 vbnullstring:

hwndexcel = findwindow(vbnullstring, "microsoft excel")

處理上述情況的另外一種辦法是改寫宣告部分,將需要傳遞 null 的引數的資料型別宣告為 long,這樣修改以後,在呼叫時將該引數設定為 0& 即可。如下所示:

declare function findwindowwithnull lib "user32" -

alias "findwindowa" (byval lpclassname as long, _

byval lpwindowname as string) as long

hwndexcel = findwindow(0&, "microsoft excel")

傳遞屬性

屬性必須以使用值方式傳遞。如果某個引數被宣告為 byval,那麼它可以直接傳遞屬性。例如,可以使用下面的過程確定螢幕或印表機的大小(以畫素為單位):

declare function getdevicecaps lib "gdi32" alias _

"getdevicecaps" (byval hdc as long, _

byval nindex as long) as long

還可以將窗體或 printer 物件的 hdc 屬性傳遞到上面的過程中,從而得到螢幕或當前選定的印表機支援的顏色數,如下所示:

private sub form_click ()

const planes = 14, bits = 12

print "screen colors "; 

print getdevicecaps(hdc, planes)* 2 ^ _

getdevicecaps(hdc, bits)

print "printer colors ";

print getdevicecaps(printer.hdc, planes) * _

2 ^ getdevicecaps(printer.hdc, bits)

end sub

要使用引用方式傳遞乙個屬性,必須使用乙個中間變數。例如,假設要使用 getwindowsdirectory 過程來設定乙個檔案列表框控制項的 path 屬性,下面的做法將失敗的:

returnlength = getwindowsdirectory(file1.path,_

len(file1.path))

應該使用下面的**來完成這件工作:

dim temp as string, returnlength as integer

temp = string(255, 0)

returnlength = getwindowsdirectory(temp, len(temp))

temp = left(temp, returnlength)

file1.path = temp

如果要將數值屬性傳遞到需要使用引用引數的 dll 過程,同樣可以採用上面的技巧。

將控制代碼用於 dll

控制代碼是由作業系統定義的唯一的 long 型別的值。可以用它來引用窗體和控制項等物件。操作環境 dll 過程大量使用的控制代碼包括:視窗控制代碼 (hwnd),裝置上下文控制代碼 (hdc) 等等。如果過程需要用控制代碼作為引數,則應該把引數宣告為 byval long。應該把返回控制代碼的 dll 函式宣告為 long 函式。控制代碼是一種識別符號 (id) 編號,而不是指標或者數字值;不要對它們進行數**算。

可以傳遞到 dll 過程的有效控制代碼包括:窗體和非圖形控制項的 hwnd 屬性,窗體和圖象框控制項的 hdc 屬性。象其他傳遞到 dll 過程的屬性一樣,只能採用使用值方式。

傳遞變體值

如果 dll 過程使用自動化 variant 資料結構訪問引數資料,那麼 variant 型別引數的傳遞類似於其它的引數型別。如果要將 variant 資料傳遞到非 variant 型別的引數,可以使用 byval 方式傳遞 variant 資料。

C 中轉換建構函式 將其它型別轉換為當前類的型別

不管哪一種建構函式,都能夠用來初始化物件,這是建構函式的本意。假設complex類定義了以上所有的建構函式,那麼下面建立物件的方式都是正確的 complex c1 呼叫complex complex c2 10,20 呼叫complex double real,double imag complex...

PHP通過檔名獲取檔案資訊,將其複製到新目錄

array 0 array id 219 enterprise name 青牛 static 1 create time 1541671526 company name 張家港市三興醫療器械 enterprise name 一帆風順 static 1 create time 1541671526 c...

C 中禁止異常資訊傳遞到析構函式外

在有兩種情況下會呼叫析構函式。第一種是在正常情況下刪除乙個物件,例如物件超出了作用域或被顯式地delete。第二種是異常傳遞的堆疊輾轉開解 stack unwinding 過程中,由異常處理系統刪除乙個物件。在上述兩種情況下,呼叫析構函式時異常可能處於啟用狀態也可能沒有處於啟用狀態。遺憾的是沒有辦法...