这个问题很少有资料可以搜索得到,主要是因为现在的程序员要么是C/C++,要么VB(.NET), 即有一种钟爱的语言.跟罗sir交流了一下,罗sir是C#骨灰级玩家,专攻网络开发,他认为DLL 加载到exe里成为一个模块,不能对上一级的变量赋值. 除了我这种患有代码痴迷症的人,不会有人去研究这个问题了,经过几天研究,发现了一些 窍门,最近又遇上用它的地方,所以干脆发达这里来,希望对大家有所帮助: 先介绍一个API,(Windows API主要是C语言的代码): GetWindowText GetWindowText(Byval hwnd As Long,Byval lpTitle As String,Byval sz As Long) 函数会把对应窗口的标题(文本)赋值给lpTitle,也就是说DLL是可以操作exe的变量的,DLL 属于exe就应当有exe赋予权利,娶个老婆回家,饭不给吃,钱不给用,所有东西不能动,这是哪家 哲学?好,我们现在来自己搞一个API,来给VB返回一个字符串: .Code Cpp代码
在.Def文件中添加这个函数名(前面有过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 然后就是缓冲区,底层开发除了要面对 [蓝屏] 就是 [崩溃],没有给变量缓冲区可能造成内存不能为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数组是一个性质,API其实怎么声明无所谓,变量名本身是为了引用,传递的只是数 据类型 返回k的意义: VB如果用space开辟缓冲区,trim了也就无所谓了,但是C/C++不同,就算你给下个元素赋值为NULL 字符串结束了,但是fwrite等函数还是会把整个数组搞进文件,所以返回k来确定字符窜的长度是很有 必要的 |
|