VB程序员博客
08 30th, 2010
可以这样声明Sleep函数
Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
然后调用此函数。
请问如何调用VBS里的Sleep?
我写如下代码但运行出错。对象不支持该属性或方法。
Option Explicit
Private Sub Form_Click()
Dim w As Object
Set w = CreateObject("WScript.Shell")
w.sleep 5000
MsgBox "延时结束"
End Sub
我知道如何声明此API函数及如何调用。我现在主要的问题是那几句代码为什么出错?如何在VB6里调用VB Script里的Sleep?
每天回帖即可获得10分可用分!
08 7th, 2010
DLL如下:
library Project2;
uses
SysUtils,
Classes;
{$R *.res}
function add(a,b:integer):integer;
begin
add:=a+b;
end;
exports
add;
begin
end.
VB代码如下:
Private Declare Function add Lib "c:project2.dll" (a As Integer, b As Integer) As Integer
Private Sub Command1_Click()
Dim a, b As Integer
a = 1
b = 2
Print (add(a, b))
End Sub
对Delphi不熟,不过不外乎几个问题:
1、delphi中的integer对应vb6中的什么数据类型
2、参数传递是传值还是传址
楼上的经常在水园碰到。
delphi中的integer估计在vb中需要换成long之类的。
08 6th, 2010
我在程序里面做了“保存”和“另存为”两个按钮,就像word一样。如果是新文件,第一次按“保存”的时候会让你选择保存的地址,没有关闭文件的情况下,再次按保存按钮,就按第一次存的地址存文件。而不是再次弹出保存对话框选择路径。
请教,这个怎么写程序?给个大概的例子。
使用了COMMONDIALOG应该都会弹出对话框的吧
Commondialog.DialogTitle="文件另存为"
Commondialog.InitDir="D:"
Commondialog.Filter="*.Txt"
Commondialog.ShowSave
……..
设一个标记变量,标记是否保存过
dim lastfilename
第一次保存
弹出对话框
lastfilename=Commondialog.filename
saveto lastfilename
第二次保存
if lastfilename<>"" then
saveto lastfilename
end if
我的程序大致如下,我希望不要有太多的全局变量产生。
Private Sub mnu_save_Click()
Dim filenum As Integer
On Error Resume Next
With savefile
.CancelError = True
On Error GoTo ErrHandler
.Flags = cdlOFNExplorer Or _
cdlOFNLongNames Or _
cdlOFNHelpButton
.DialogTitle = "保存文件"
.InitDir = "D:communication"
.filter = "所有文件(*.*)|*.*|文本文件" & _
"(*.c2)|*.c2|批文件(*.bat)|*.bat"
.FilterIndex = 2
.ShowSave
End With
If savefile.filename <> "" Then
filenum = FreeFile()
Open savefile.filename For Output As #filenum
Write #filenum,****
Close filenum
End If
应该需要加一个全局变量来判断是不是第一次保存文件.
再顶一下,看看还有没有人知道
包括打开了一个文件,保存的时候按照打开的路径保存。现在还是保存的时候跳出保存对话框
08 6th, 2010
DLL如下:
library Project2;
uses
SysUtils,
Classes;
{$R *.res}
function add(a,b:integer):integer;
begin
add:=a+b;
end;
exports
add;
begin
end.
VB代码如下:
Private Declare Function add Lib "c:project2.dll" (a As Integer, b As Integer) As Integer
Private Sub Command1_Click()
Dim a, b As Integer
a = 1
b = 2
Print (add(a, b))
End Sub
对Delphi不熟,不过不外乎几个问题:
1、delphi中的integer对应vb6中的什么数据类型
2、参数传递是传值还是传址
楼上的经常在水园碰到。
delphi中的integer估计在vb中需要换成long之类的。
08 4th, 2010
你们好!呵呵呵,我自学不精,经过别人推荐来到这里问问大家。多谢了!想了很长时间都没有想出来。
程序是这样的
Private Command1.Click()
shell app.path & "Test.bat"
End Sub
BAT文件是这样的
copy Repairmci32.ocx %systemroot%system32
regsvr32 /s %systemroot%system32mci32.ocx
copy /Y repair*.* %systemroot%system32
font
pause
其中font是一个可执行程序,全名font.exe
可是程序执行时候BAT运行不正常。但是直接双击BAT文件可以正常使用。
百思不得其解,请大家指教。。。
用命令行执行不会有问题
具体方法请看下面的链接。
http://topic.csdn.net/t/20050201/15/3768662.html
按理说是不会你可以这样做下简单的测试
在批处理中使用Pause和echo来做表识看执行到哪出错的
你把出错提示贴出来,不一定是不是bat问题…
应该先调用 cmd.exe
shell cmd.exe 空一格后跟着bat的路径
因为没调用 cmd 才会不执行!
shell cmd.exe /c 空一格后跟着bat的路径
哦,多谢大家,我第一次来,如果我提问不太好请见谅~
我试试看,不行我再来发
那就是
shell "cmd.exe Myproject.bat"
对了,没错
不过似乎一样的方式去打开。。。
shell只能执行可执行文件,bat不是可执行文件只是特定的命令集,所以要用cmd.exe执行。
哦!Tiger_Zhao说的很有道理!明白了!不知道怎么结贴或者结束问题?论坛第一次接触,不好意思,见笑了…
明白了,多谢大家~
多谢多谢,明白了!大家真是热情。不知道怎么采纳或者怎么处理帖子?
〖管理贴子〗按钮进去
5分啊!! 强悍!! 我第一个答对的! 怎么说也应该有1分吧!
不错啊! 有收获。。。
啊! 晕! 忘记了这个帐号不是我的!
…
问题解决了..怎么不放分?
Rtn = Shell("C:WINDOWSsystem32cmd.exe /c E:commit projectConfigFileAutoMakeVer.bat", vbNormalFocus)
为什么我这样些还是不行,总是一闪而过,如果把/c去掉,那么就会弹出cmd窗口,但是没有执行bat 只是改了reboot路径 变成
E:vb toolsprjDopacket>
没有执行bat,不过我的VB工程是E:vb toolsprjDopacket这个路径,请大家看看怎么回事
07 31st, 2010
原型如下:
/*——————————–交易上传结构体定义———————————*/
struct TransUp
{
BYTE OperateType[Operate_T_L]; //操作类型
BYTE TransType[Trans_T_L]; //交易类型
BYTE CardType[Card_T_L]; //卡类型
BYTE CashRegNo[CashReg_N_L]; //收银机编号
BYTE CasherNo[Casher_N_L]; //柜员号
BYTE Amount[Amount_L]; //金额
BYTE CashTraceNo[CashTrace_N_L]; //收银流水号
BYTE OriginCashTraceNo[CashTrace_N_L]; //原收银流水号
BYTE Reserved[48]; //预留字段
};
/*——————————交易查询,返回结构体定义——————————*/
struct TransDown
{
BYTE OperateType[Operate_T_L]; //操作类型
BYTE TransType[Trans_T_L]; //交易类型
BYTE CardType[Card_T_L]; //卡类型
BYTE ResponseCode[ResponseCode_L]; //返回码
BYTE ResponseMsg[ResponseMsg_L]; //返回信息
BYTE CashRegNo[CashReg_N_L]; //收银机编号
BYTE CasherNo[Casher_N_L]; //柜员号
BYTE Amount[Amount_L]; //金额
BYTE SettleNum[Settel_N_L]; //结算批次号
BYTE MerchantID[MerchantID_N_L]; //商户号
BYTE MerchantName[MerchantName_L]; //商户名称
BYTE TerminalID[TerminalID_N_L]; //终端号
BYTE CardNo[Card_N_L]; //卡号
BYTE Exp_Date[ExpDate_L]; //有效期
BYTE BankNo[Bank_N_L]; //发卡行标识
BYTE TransDate[TransDate_L]; //交易日期
BYTE TransTime[TransTime_L]; //交易时间
BYTE Auth_Code[AuthCode_N_L]; //授权号
BYTE SysRefNo[Sysref_N_L]; //系统参照号
BYTE CashTraceNo[CashTrace_N_L]; //收银流水号
BYTE OriginCashTraceNo[CashTrace_N_L]; //原收银流水号
BYTE SysTraceNo[SysTrace_N_L]; //系统流水号
BYTE OriginSysTraceNo[SysTrace_N_L]; //原系统流水号
BYTE Reserved[48]; //预留字段
};
void Trans (int com,char * TransUp, char * TransDown);
请问各位大侠在VB中如何调用该函数及参数传递
急急急,在线等!
先谢谢啦!!!
Operate_T_L这些也要原型才行
我也这样试过,但_TransUp中有些值未传递过去。
Private Declare Sub Trans Lib "DLL 名称" (ByVal com As Long, ByRef TransUp As Byte, ByRef TransDown As Byte)
Dim tu(8) As Byte
Dim td(23) As Byte
Dim nCom As Long
nCom = 1
Call Trans(nCom, tu(0), td(0))
谢谢各位,此问题已解决,原来是DLL还需调用INI文件。
07 31st, 2010
原型如下:
/*——————————–交易上传结构体定义———————————*/
struct TransUp
{
BYTE OperateType[Operate_T_L]; //操作类型
BYTE TransType[Trans_T_L]; //交易类型
BYTE CardType[Card_T_L]; //卡类型
BYTE CashRegNo[CashReg_N_L]; //收银机编号
BYTE CasherNo[Casher_N_L]; //柜员号
BYTE Amount[Amount_L]; //金额
BYTE CashTraceNo[CashTrace_N_L]; //收银流水号
BYTE OriginCashTraceNo[CashTrace_N_L]; //原收银流水号
BYTE Reserved[48]; //预留字段
};
/*——————————交易查询,返回结构体定义——————————*/
struct TransDown
{
BYTE OperateType[Operate_T_L]; //操作类型
BYTE TransType[Trans_T_L]; //交易类型
BYTE CardType[Card_T_L]; //卡类型
BYTE ResponseCode[ResponseCode_L]; //返回码
BYTE ResponseMsg[ResponseMsg_L]; //返回信息
BYTE CashRegNo[CashReg_N_L]; //收银机编号
BYTE CasherNo[Casher_N_L]; //柜员号
BYTE Amount[Amount_L]; //金额
BYTE SettleNum[Settel_N_L]; //结算批次号
BYTE MerchantID[MerchantID_N_L]; //商户号
BYTE MerchantName[MerchantName_L]; //商户名称
BYTE TerminalID[TerminalID_N_L]; //终端号
BYTE CardNo[Card_N_L]; //卡号
BYTE Exp_Date[ExpDate_L]; //有效期
BYTE BankNo[Bank_N_L]; //发卡行标识
BYTE TransDate[TransDate_L]; //交易日期
BYTE TransTime[TransTime_L]; //交易时间
BYTE Auth_Code[AuthCode_N_L]; //授权号
BYTE SysRefNo[Sysref_N_L]; //系统参照号
BYTE CashTraceNo[CashTrace_N_L]; //收银流水号
BYTE OriginCashTraceNo[CashTrace_N_L]; //原收银流水号
BYTE SysTraceNo[SysTrace_N_L]; //系统流水号
BYTE OriginSysTraceNo[SysTrace_N_L]; //原系统流水号
BYTE Reserved[48]; //预留字段
};
void Trans (int com,char * TransUp, char * TransDown);
请问各位大侠在VB中如何调用该函数及参数传递
急急急,在线等!
先谢谢啦!!!
Operate_T_L这些也要原型才行
我也这样试过,但_TransUp中有些值未传递过去。
Private Declare Sub Trans Lib "DLL 名称" (ByVal com As Long, ByRef TransUp As Byte, ByRef TransDown As Byte)
Dim tu(8) As Byte
Dim td(23) As Byte
Dim nCom As Long
nCom = 1
Call Trans(nCom, tu(0), td(0))
谢谢各位,此问题已解决,原来是DLL还需调用INI文件。
07 27th, 2010
关于VB6调用DLL的问题
用VB6编译的一个DLL,用VB6编译的EXE调用
DLL平时都不用更改,但是DLL只要更改了一点点内容,完全不影响正常操作
覆盖了原先的DLL,VB6编译的EXE就不能运行了
只要运行到了调用DLL的模块的地方,都报不能创建对象等错误
只能再用VB6重新编译EXE才行
这是为什么
DLL的存在不是于更加方便的升级程序么,我现在这种情况,更新下DLL无比复杂。
你确定只是改了DLL ? 然后你改了DLL之后函数增加了新的字段 你的程序还是老的函数 当然是不行的
编译dll时选二进制兼容试试
请教各位高手:
1、如何用VB编dll?
2、怎样看dll中的原代码?
<
二进制兼容一定要对前DLL进行升级才行么?
没有前DLL有没有办法让其进行兼容
在不动原DLL函数的接口及返回值的情况下,进行增加和修改
升级DLL时只需覆盖重新注册即可 EXE不需要重编译
VB6才有这种现象么?其他语言编译成的DLL是否也会这样 如VB2005 C#?<
VC 还需要自己指定 tlb 版本,指定每个对象的 GUID,自己判断什么时候可以覆盖原版本和GUID进行编译,什么时候必须升级版本更新GUID再编译。
VB 只需要先编译一个dll,然后设为二进制兼容并选上dll——这也嫌麻烦,不如转行。
那就用 VC++ 编写标准(API)DLL。VB 调用新版本 DLL 时什么都不用改。
<
学习中!
学习。。。
完全看不懂….继续学习…
一定是有引用
不相同的
C#开发能够同时更新,VB是要反复调
试
楼主用二进制兼容试试
07 27th, 2010
关于VB6调用DLL的问题
用VB6编译的一个DLL,用VB6编译的EXE调用
DLL平时都不用更改,但是DLL只要更改了一点点内容,完全不影响正常操作
覆盖了原先的DLL,VB6编译的EXE就不能运行了
只要运行到了调用DLL的模块的地方,都报不能创建对象等错误
只能再用VB6重新编译EXE才行
这是为什么
DLL的存在不是于更加方便的升级程序么,我现在这种情况,更新下DLL无比复杂。
你确定只是改了DLL ? 然后你改了DLL之后函数增加了新的字段 你的程序还是老的函数 当然是不行的
编译dll时选二进制兼容试试
请教各位高手:
1、如何用VB编dll?
2、怎样看dll中的原代码?
<
二进制兼容一定要对前DLL进行升级才行么?
没有前DLL有没有办法让其进行兼容
在不动原DLL函数的接口及返回值的情况下,进行增加和修改
升级DLL时只需覆盖重新注册即可 EXE不需要重编译
VB6才有这种现象么?其他语言编译成的DLL是否也会这样 如VB2005 C#?<
VC 还需要自己指定 tlb 版本,指定每个对象的 GUID,自己判断什么时候可以覆盖原版本和GUID进行编译,什么时候必须升级版本更新GUID再编译。
VB 只需要先编译一个dll,然后设为二进制兼容并选上dll——这也嫌麻烦,不如转行。
那就用 VC++ 编写标准(API)DLL。VB 调用新版本 DLL 时什么都不用改。
<
学习中!
学习。。。
完全看不懂….继续学习…
一定是有引用
不相同的
C#开发能够同时更新,VB是要反复调
试
楼主用二进制兼容试试
07 22nd, 2010
模式窗体调用一个非模式窗体,怎么让这个非模式窗体一显示出来时就处于焦点状态(即标题栏不是灰色)
注:模式窗体调用非模式窗体,我已经实现了,不要给我说实现不了这些废话哈!
楼主那么牛,围观一下…………
这还叫模式窗体吗?
<
我晕,都不信邪说!
我真实现了!
<
<
可以实现。
一种是设置WS_CHILD风格并激活该窗口。
另一种是子类化该窗口,在WM_NCACTIVATE事件里使用SendMessage hwnd, WM_NCACTIVATE, 1, ByVal 0&保持窗口标题栏活动状态。
以上我只是从理论上讲,并没有测试过,感兴趣的朋友不妨自己测试一下。
mark 7楼的理论
<
<
如需要阅读该回复,请