有没有将VB代码转换为VC代码的工具?

wu_yongcai 2000-08-23 02:56:00
加精
...全文
288 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ideal 2000-08-26
  • 打赏
  • 举报
回复
to liuwc: 老兄高才,何不作一转换程序,以供他人利用?这或许是 VB Programmer 之福(可惜我没学过VB!)。
0xFFCD 2000-08-25
  • 打赏
  • 举报
回复
把VC++代码转换成VB代码到是可以,但反过来我就不会了,不好意思。
 
对于大多数VB的爱好者来说,在很多情况下都想通过使用API函数来实现一些比较高级的功能或达到某种特殊效果,这就需要用到一些VC++的代码.
  本文就如何把VC++代码转换成VB代码给出了一些策略和方法.

  1.定义常量

  我们首先看第一个例子:

#defineSTD_COPY1//COMMCTRL.H

  在VC++代码中用#define定义常量,而在VB中是用Const来定义,因此转换成VB的代码是:

PublicConstSTD_COPY=1

  第二个例子:

#defineLB_SELECTSTRING0x018C//WINUSER.h

  这有一个问题,VC++中所有以"0x"开头的值是十六进制,而在VB中表示十六进制要用"&H"开头.因此转换成VB的代码为:

ConstLB_SELECTSTRING=0x018C

  第三个例子:

#defineTCN_FIRST(0U-550U)

  这里有个特别的是定义的值是以"U"结尾,这是意味着该常量的类型是"unsigned long"(在VB中不支持该数据类型).但是unsignedlong和signedlong(在VB中是Long)两种数据类型的值在存储方式上是一样的,只是表现的形式不同.因此,我们只需要去掉末尾的"U"就可以了.

ConstTCN_FIRST=(0-550)这同样适合以"L"结尾的值

  另外,对于#defineCDDS_ITEMPOSTERASE(CDDS_ITEM |CDDS_POSTERASE),我们需要用"Or"来取代"|"

  2.结构的定义

  我们先看VC++定义的一个比较简单的结构:

typedefstructtagTBSAVEPARAMSA{
HKEYhkr;
LPCSTRpszSubKey;
LPCSTRpszValueName;
}TBSAVEPARAMSA,FAR*LPTBSAVEPARAMSA;

  首先我们需要把第一行的"typedefstruct"转换成"Public Type"

PublicTypetagTBSAVEPARAMSA

  然后处理结构成员,

HKEYhkr;
LPCSTRpszSubKey;
LPCSTRpszValueName;

  对于第一个成员类型HKEY.我们要知道VC++中的以"H"开头的大部分数据类型代表的是某种句柄.在VB中每一个Form对象和许多控件都有一个hWnd属性,它代表所属窗口的句柄.hWnd的类型是Long,并且所有用来存储句柄的变量类型都是Long.因此,该成员在VB中定义为:

hkrAsLong

  同样的,VC++数据类型LPSTR和LPCSTR代表指向字符串的指针,在VB中可以当作String类型.因为当你传送结构给API时,VB将把结构中所有的String转换成指向ANSI字符串的指针.因此后两个成员在VB中表示为:

pszSubKeyAsString
pszValueNameAsString

对于最后一行"}TBSAVEPARAMSA,FAR*
LPTBSAVEPARAMSA;"我们只需要用
"EndType"取代

  就可以了.转换成VB代码后完整的结构为:

PublicTypetagTBSAVEPARAMSA
hkrAsLong
pszSubKeyAsString
pszValueNameAsString
EndType

  以下是VC++中数据类型对应到VB中的数据类型VC++数据类型VB数据类型

                  
shortInteger
intLong
longLong
UNITLong
ULONGLong
WORD,DWORDLong
WPARAM,LPARAMLong
WMSG,UMSGLong
HRESULTLong
BOOLBoolean
COLORREFLong
HWND,HDC,HBRUSH,HKEY,等等.Long
LPSTR,LPCSTRString
LPWSTR,OLECHAR,BSTRString
LPTSTRString
VARIANT_BOOLBoolean
unsignedcharByte
BYTEByte
VARIANTVariant
(任何以*或**结尾的数据类型)Long

  3.函数的转换

  我们知道VB提供了APIVieweradd-in,但是有很多API函数它并没有包括在内. 因此知道如何把VC++函数转换成VB的函数格式是非常重要的.先看第一个例子:

WINCOMMCTRLAPIHWNDWINAPI
CreateStatusWindowsA(LONGstyle,
LPCSTRlpszTest,HWNDhwndParent,UINTwID);

  这个函数创建一个StatusBar控件.从WINCOMMCTRLAPI可以得知该函数来自动态链接库ComCtl32.dll.(有时,我们需要从MSDN中查找某函数对应的DLL)然后我们知道该函数的返回类型是HWND,对应VB的类型是Long.最后,根据前面提到类型对应表,很容易的转换相应的函数参数.

PublicDeclareFunctionCreateStatusWindowALib
"ComCtl32.dll"_
(ByvalstyleAsLong,_
ByvallpszTextAsString,_
ByvalhwndParentAsLong,ByvalwIDAsLong)AsLong

E-boy http://www.kubao.com



   (\/)(\/) /:""| (\/)(\/)(\/) 
 >>>>>>==\/==\/===)`66|===\/==\/==\/====> 
         C`  _)  
          \ ._|   
          ) /  
       



16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧