扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1.定义量
公司主营业务:做网站、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出大名免费做网站回馈大家。
我首先看第例:
#define STD_COPY1//COMMCTRL.H
VC++代码用#define定义量,VB用Const定义,转换VB代码:
Public ConstSTD_COPY=1
第二例:
#define LB_SELECTSTRING0x018C//WINUSER.h
问题,VC++所"0x"值十六进制,VB表示十六进制要用"H".转换VB代码:
Const LB_SELECTSTRING=0x018C
#define R_DATALENGTH 15
首先将这个转换为常量(VB也有预编译只能,只是功能...)。
Private Const R_DATALENGTH As Long = 15
DWORD 占四字节,用 Long 替换。
WORD 占两字节,用 Integer 替换。
char 占一字节,用 Byte 替换。
VB没有有无符号,所以替换如下:
Private Type MY_ITEM
r_Item1 As Long
r_Item2 As Integer
r_Item(R_DATALENGTH) As Byte
End Type
联合VB中也没有,只能用类型替代,那个无名结构体起名为 NoName,
VC++中的int是4字节的,所以用Long代替,而不用Integer:
Private Type NoName
item1 As Long
item2 As Single
item3 As Single
item4 As Single
End Type
NoName和MY_ITEM最长的是24字节,定义24字节:
Private Type MY_SSS
Memories(1 To 24) As Byte
End Type
下一个的替换也按照上面的道理,
其中的联合中的DWORD和int都是Long,就合并了:
Private Type MY_TTT
item01 As Long
item02 As Long
item001Oritem002 As Long
item03(R_DATALENGTH) As Byte
End Type
以下的指针都占4个字节,用Long代替。
Private Type MY_DATA
item0001 As Long
item0002 As Long
item0003 As MY_TTT
item0004 As Long
m_item0x As Long
End Type
联合就是共用一块内存,需要内存拷贝的API函数,我们在最上面声明:
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
ByVal Dst As Long, _
ByVal Src As Long, _
ByVal Length As Long _
)
MY_SSS、NoName、MY_ITEM需要内存拷贝,我们写出他们的函数:
Private Sub MYSSS_TO_MYITEM(ByRef SSS As MY_SSS, ByRef ITEM As MY_ITEM)
CopyMemory VarPtr(ITEM), VarPtr(SSS), LenB(ITEM)
End Sub
Private Sub MYITEM_TO_MYSSS(ByRef SSS As MY_SSS, ByRef ITEM As MY_ITEM)
CopyMemory VarPtr(SSS), VarPtr(ITEM), LenB(ITEM)
End Sub
Private Sub MYSSS_TO_NONAME(ByRef SSS As MY_SSS, ByRef NoName As NoName)
CopyMemory VarPtr(NoName), VarPtr(SSS), LenB(NoName)
End Sub
Private Sub NONAME_TOMYSSS(ByRef SSS As MY_SSS, ByRef NoName As NoName)
CopyMemory VarPtr(SSS), VarPtr(NoName), LenB(NoName)
End Sub
我们可以在窗体中添加一个按钮,试试联合,看看两个类型(结构体)之间的
内存是否互相影响了,影响就说明联合成功,代码如下:
Private Sub Command1_Click()
Dim s As MY_SSS
Dim i As MY_ITEM
Dim n As NoName
MYSSS_TO_MYITEM s, i
'这里对MY_ITEM的i进行操作。
i.r_Item1 = 3
i.r_Item2 = 7
MYITEM_TO_MYSSS s, i
MYSSS_TO_NONAME s, n
'这里对NoName的n进行操作。
MsgBox n.item1
MsgBox n.item2
NONAME_TO_MYSSS s, n
End Sub
结果很成功。
运用指针就调用CopyMemory函数,第一个参数是目的变量指针,
第二个参数是源指针,第三个参数是复制长度。
VB用运用指针,VarPtr返回除字符串外的变量指针。
字符串变量的指针是直接传递,而StrPtr则返回缓冲区首地址的
内容,对象的指针用ObjPtr获取。
整理以下所有的代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
ByVal Dst As Long, _
ByVal Src As Long, _
ByVal Length As Long _
)
Private Const R_DATALENGTH As Long = 15
Private Type MY_ITEM
r_Item1 As Long
r_Item2 As Integer
r_Item(R_DATALENGTH) As Byte
End Type
Private Type NoName
item1 As Long
item2 As Single
item3 As Single
item4 As Single
End Type
Private Type MY_SSS
Memories(1 To 24) As Byte
End Type
Private Type MY_TTT
item01 As Long
item02 As Long
item001Oritem002 As Long
item03(R_DATALENGTH) As Byte
End Type
Private Type MY_DATA
item0001 As Long
item0002 As Long
item0003 As MY_TTT
item0004 As Long
m_item0x As Long
End Type
Private Sub MYSSS_TO_MYITEM(ByRef SSS As MY_SSS, ByRef ITEM As MY_ITEM)
CopyMemory VarPtr(ITEM), VarPtr(SSS), LenB(ITEM)
End Sub
Private Sub MYITEM_TO_MYSSS(ByRef SSS As MY_SSS, ByRef ITEM As MY_ITEM)
CopyMemory VarPtr(SSS), VarPtr(ITEM), LenB(ITEM)
End Sub
Private Sub MYSSS_TO_NONAME(ByRef SSS As MY_SSS, ByRef NoName As NoName)
CopyMemory VarPtr(NoName), VarPtr(SSS), LenB(NoName)
End Sub
Private Sub NONAME_TO_MYSSS(ByRef SSS As MY_SSS, ByRef NoName As NoName)
CopyMemory VarPtr(SSS), VarPtr(NoName), LenB(NoName)
End Sub
Private Sub Command1_Click()
Dim s As MY_SSS
Dim i As MY_ITEM
Dim n As NoName
MYSSS_TO_MYITEM s, i
'这里对MY_ITEM的i进行操作。
i.r_Item1 = 3
i.r_Item2 = 7
MYITEM_TO_MYSSS s, i
MYSSS_TO_NONAME s, n
'这里对NoName的n进行操作。
MsgBox n.item1
MsgBox n.item2
NONAME_TO_MYSSS s, n
End Sub
VB与VB.net严格上来说还是同一种语言,因为vb.net可以将VB6.0以前版本的源代码进行转换,区别他们的根本在于VB.net用于微软全新的.net框架,如果你编译了一个Vb.net的程序在没有装.net框架的环境下是运行不了的,VB6.0编译生成的是win32位应用程序,他可以适合于目前所有的操作系统,但是他是微软98年的产品,所以到目前已经很老了,和VC++6.0是同一时代的产品,目前VB的最新版本是VB.net2008,语法和VB6.0有出入,但是不大,加入了很多的新元素,如继承。。windows不可能不支持VB,因为VB是微软自己开发的语言!
这是函数的引用 而不是函数体本身,你要找到函数体本身,比如
... fnName(...)
{...
}
带有大括号的,如果仅仅是转换函数声明为VB,那简单了,交换一下位置就OK了。
还有,最后那句是函数的调用。
那个unsigned没办法,你只能转成字节数组
Structure msg_temp
Dim p1 As Long (这个是有符号的,或者换字节数组: Dim p1(3) As Byte)
Dim p2 As byte
.....
Dim p5 As byte
Dim p6(3) as Byte
.....
End Structure
这样太麻烦了,建议你用类模块解决,可以增加2个转换函数
完整转
//by 史莱姆
delegate int DllGetClassObjectDelegate(ref Guid ClassId, ref Guid InterfaceId, [Out, MarshalAs(UnmanagedType.Interface)] out object ppunk);
public object Dmnullreg()
{
Guid classfactoryguid = typeof(IClassFactory).GUID;
Guid interfguid = typeof(Idmsoft).GUID;
//这两个Guid 在哪得自己看dm.dll就行.不同版本不同
IntPtr libH = LoadLibrary("dm.dll");
if (libH == IntPtr.Zero)
return false ;
IntPtr factoryFunc = GetProcAddress(libH, "DllGetClassObject");
if (factoryFunc == IntPtr.Zero)
return false;
DllGetClassObjectDelegate factoryDel = (DllGetClassObjectDelegate)Marshal.GetDelegateForFunctionPointer(factoryFunc, typeof(DllGetClassObjectDelegate));
object classfactoryO;
factoryDel(ref classguid, ref classfactoryguid, out classfactoryO);
if (classfactoryO == null)
return false;
IClassFactory classfactory = (IClassFactory)classfactoryO;
object classinstancea = null;
classfactory.CreateInstance(classinstancea, ref interfguid, out obj_object);
Marshal.FinalReleaseComObject(classfactory);
return obj_object;
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流