這個問題很少有資料可以搜索得到,主要是因為現(xiàn)在的程序員要么是C/C++,要么VB(.NET),
即有一種鐘愛的語言.跟羅sir交流了一下,羅sir是C#骨灰級玩家,專攻網絡開發(fā),他認為DLL
加載到exe里成為一個模塊,不能對上一級的變量賦值.
除了我這種患有代碼癡迷癥的人,不會有人去研究這個問題了,經過幾天研究,發(fā)現(xiàn)了一些
竅門,最近又遇上用它的地方,所以干脆發(fā)達這里來,希望對大家有所幫助:
先介紹一個API,(Windows API主要是C語言的代碼):
GetWindowText
GetWindowText(Byval hwnd As Long,Byval lpTitle As String,Byval sz As Long)
函數(shù)會把對應窗口的標題(文本)賦值給lpTitle,也就是說DLL是可以操作exe的變量的,DLL
屬于exe就應當有exe賦予權利,娶個老婆回家,飯不給吃,錢不給用,所有東西不能動,這是哪家
哲學?好,我們現(xiàn)在來自己搞一個API,來給VB返回一個字符串:
.Code
在.Def文件中添加這個函數(shù)名(前面有過VB,VC混合編程第一步的介紹),然后VB里面這樣引用(這里最關鍵):
[Private/Public] Declare Function GetFileName Lib "XXX.DLL" (Byval lpString As String,Byval lpResult As String, _
Byval lngCount As String) As Long
然后就是緩沖區(qū),底層開發(fā)除了要面對 [藍屏] 就是 [崩潰],沒有給變量緩沖區(qū)可能造成內存不能為Read的錯誤
Dim s As String,ss As String * 256
Rem 如果上面沒有定長可以用 ss = space(256) 或者 ss = String(...)
s = "C:/windows/system32/shell32.dll"
Dim l As Long
l = GetFileName(s,ss,256)
ss = left(ss,l)
一個山寨版的 GetWindowText 就是這樣了
關于//可能還有人問,前面有關于正則表達式的文章,看下就Okay了,就當前的問題,幾個小地方要注意
VB跟C#累似(應該說C# 是vb和C/C++中走來),消去了指針,不要嘗試給VB返回任何指針,VB可以用
AddressOf給一個API過程傳遞地址
VB的String和Byte數(shù)組是一個性質,API其實怎么聲明無所謂,變量名本身是為了引用,傳遞的只是數(shù)
據(jù)類型
返回k的意義:
VB如果用space開辟緩沖區(qū),trim了也就無所謂了,但是C/C++不同,就算你給下個元素賦值為NULL
字符串結束了,但是fwrite等函數(shù)還是會把整個數(shù)組搞進文件,所以返回k來確定字符竄的長度是很有
必要的
聯(lián)系客服