VB程序员博客
04 30th, 2010
Private Declare Function NetUserAdd Lib "netapi32.dll" (ServerName As Byte, ByVal Level As Long, Buffer As USER_INFO_1, ParmError As Long) As Long
Private Declare Function NetUserDel Lib "netapi32.dll" (ByVal ServerName As String, ByVal Username As String) As Long
Private Type USER_INFO_1
ptrName As Long
ptrstrPassWord As Long
dwstrPassWordAge As Long
dwPriv As Long
ptrHomeDir As Long
ptrComment As Long
dwFlags As Long
ptrScriptPath As Long
End Type
Private Const NERR_Success As Long = 0&
Private Const USER_PRIV_USER = 1
Private Const UF_NORMAL_ACCOUNT = &H200
Private Const UF_SCRIPT = &H1
Private m_strUserName As String
Private Const UF_ACCOUNTDISABLE = &H2
Private Const UF_HOMEDIR_REQUIRED = &H8
Private Const UF_PASSWD_NOTREQD = &H20
Private Const UF_PASSWD_CANT_CHANGE = &H40
Private Const UF_LOCKOUT = &H10
Private Const UF_DONT_EXPIRE_PASSWD = &H10000
Private Declare Function NetLocalGroupAddMembers Lib "netapi32.dll" (ByVal ServerName As String, ByVal GroupName As String, ByVal Level As Long, buf As Any, ByVal totalentries As Long) As Long
Private Type LOCALGROUP_MEMBERS_INFO_3
lgrmi3_domainandname As Long
End Type
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_RESTORE = 9
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Const SPI_GETWORKAREA = 48
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Function AddUser(ByVal Username As String, ByVal Password As String) As Boolean
AddUser = False
Dim ParmError As Long
Dim UI As USER_INFO_1
Dim UI3 As LOCALGROUP_MEMBERS_INFO_3
Dim Result As Long
With UI
.ptrName = StrPtr(Username)
.ptrstrPassWord = StrPtr(Password)
.dwstrPassWordAge = 3
.dwPriv = USER_PRIV_USER
.ptrComment = StrPtr("")
.dwFlags = UF_SCRIPT Or UF_NORMAL_ACCOUNT Or UF_PASSWD_CANT_CHANGE Or UF_DONT_EXPIRE_PASSWD
End With
Result = NetUserAdd(0, 1, UI, ParmError)
Result = AddUserToGroup(vbNullString, "Administrators", Username)
If Result = NERR_Success Then AddUser = True
End Function
Function DelUser(ByVal Username As String) As Boolean
Dim lngResult As Long
Dim strUnicodeUserName As String
strUnicodeUserName = StrConv(Username, vbUnicode)
lngResult = NetUserDel(vbNullString, strUnicodeUserName)
If lngResult = NERR_Success Then DelUser = True
End Function
Function AddUserToGroup(ByVal ServerName As String, ByVal GroupName As String, ByVal Username As String) As Long
Dim lngResult As Long
Dim strServerName As String
Dim strLocalGroupName As String
Dim udtLGMemInfo As LOCALGROUP_MEMBERS_INFO_3
strLocalGroupName = StrConv(GroupName, vbUnicode)
udtLGMemInfo.lgrmi3_domainandname = StrPtr(Username)
lngResult = NetLocalGroupAddMembers(vbNullString, strLocalGroupName, 3, udtLGMemInfo, 1)
End Function
我一开始还以为是360给阻止了。结果我裸奔都还是没行,
调试时能建立帐户,生成成.exe后,就无法建立用户了。
求达人指教。
我是在administrator权限运行的。
我难道没事做,调试时还切换权限来运行?你以为我闲得慌啊。
04 30th, 2010
Private Declare Function NetUserAdd Lib "netapi32.dll" (ServerName As Byte, ByVal Level As Long, Buffer As USER_INFO_1, ParmError As Long) As Long
Private Declare Function NetUserDel Lib "netapi32.dll" (ByVal ServerName As String, ByVal Username As String) As Long
Private Type USER_INFO_1
ptrName As Long
ptrstrPassWord As Long
dwstrPassWordAge As Long
dwPriv As Long
ptrHomeDir As Long
ptrComment As Long
dwFlags As Long
ptrScriptPath As Long
End Type
Private Const NERR_Success As Long = 0&
Private Const USER_PRIV_USER = 1
Private Const UF_NORMAL_ACCOUNT = &H200
Private Const UF_SCRIPT = &H1
Private m_strUserName As String
Private Const UF_ACCOUNTDISABLE = &H2
Private Const UF_HOMEDIR_REQUIRED = &H8
Private Const UF_PASSWD_NOTREQD = &H20
Private Const UF_PASSWD_CANT_CHANGE = &H40
Private Const UF_LOCKOUT = &H10
Private Const UF_DONT_EXPIRE_PASSWD = &H10000
Private Declare Function NetLocalGroupAddMembers Lib "netapi32.dll" (ByVal ServerName As String, ByVal GroupName As String, ByVal Level As Long, buf As Any, ByVal totalentries As Long) As Long
Private Type LOCALGROUP_MEMBERS_INFO_3
lgrmi3_domainandname As Long
End Type
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_RESTORE = 9
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Const SPI_GETWORKAREA = 48
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Function AddUser(ByVal Username As String, ByVal Password As String) As Boolean
AddUser = False
Dim ParmError As Long
Dim UI As USER_INFO_1
Dim UI3 As LOCALGROUP_MEMBERS_INFO_3
Dim Result As Long
With UI
.ptrName = StrPtr(Username)
.ptrstrPassWord = StrPtr(Password)
.dwstrPassWordAge = 3
.dwPriv = USER_PRIV_USER
.ptrComment = StrPtr("")
.dwFlags = UF_SCRIPT Or UF_NORMAL_ACCOUNT Or UF_PASSWD_CANT_CHANGE Or UF_DONT_EXPIRE_PASSWD
End With
Result = NetUserAdd(0, 1, UI, ParmError)
Result = AddUserToGroup(vbNullString, "Administrators", Username)
If Result = NERR_Success Then AddUser = True
End Function
Function DelUser(ByVal Username As String) As Boolean
Dim lngResult As Long
Dim strUnicodeUserName As String
strUnicodeUserName = StrConv(Username, vbUnicode)
lngResult = NetUserDel(vbNullString, strUnicodeUserName)
If lngResult = NERR_Success Then DelUser = True
End Function
Function AddUserToGroup(ByVal ServerName As String, ByVal GroupName As String, ByVal Username As String) As Long
Dim lngResult As Long
Dim strServerName As String
Dim strLocalGroupName As String
Dim udtLGMemInfo As LOCALGROUP_MEMBERS_INFO_3
strLocalGroupName = StrConv(GroupName, vbUnicode)
udtLGMemInfo.lgrmi3_domainandname = StrPtr(Username)
lngResult = NetLocalGroupAddMembers(vbNullString, strLocalGroupName, 3, udtLGMemInfo, 1)
End Function
我一开始还以为是360给阻止了。结果我裸奔都还是没行,
调试时能建立帐户,生成成.exe后,就无法建立用户了。
求达人指教。
我是在administrator权限运行的。
我难道没事做,调试时还切换权限来运行?你以为我闲得慌啊。
04 7th, 2009
VB工程在调试时,点击菜单“退出”,怎么把工程也关了
工程结构是主窗体+子窗体结构的
部份代码如下:
Public Sub M2_退出系统_Click()
Unload Me
End Sub
Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MsgBox("确定要退出系统吗?", vbOKCancel + vbQuestion, "系统提示") = vbCancel Then
Cancel = -1
End If
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
End
End Sub
现在问题是,我在调试时,点“退出系统”,则把工程也一起关闭了。有人知道原因吗?
End 语句提供了一种强迫中止程序的方法。Visual Basic 程序正常结束应该卸载所有的窗体。只要没有其它程序引用该程序公共类模块创建的对象并无代码执行,程序将立即关闭。
up
11 25th, 2008
请问在立即窗口中显示“?表达式或者变量“的值的具体步骤。谢谢!
单步调式或设断点,等程序停下来的时候就可以在立即窗口进行你想要的操作。
Debug.print 变量名
比如你要看变量strName
在程序中设置断点,当程序运行到断点处
在立即窗口输入
?strName
回车
正解
11 7th, 2008
因为先前VB程序调试出过错,再把鼠标移到在变量名上面时,变量值就不再显示,望大虾们帮想想办法,在下有礼了
工具-选项-编辑器-选中"自动显示数据提示",按确定即可.
一般重启下就好了
颜色问题,鼠标放在变量名上,前景色和背景色相同了。重启电脑,或者重装VB。
可以试试ctrl+F5全编译运行,找到问题的所在.
因为vb是根据预先定义的类型来获取变量值信息的,
如果类型冲突,很有可能会影响变量值的分析.
把电脑送给我,
再去买一台.再装上VB等等.
当然重装系统,重装VB,或注销系统这三种方式都可以解决上面我提到的问题,但是 就算用最彻底的方法 重装系统 暂时解决了问题,只要VB程序调试出现了语法
错误,鼠标放在变量名上面,变量值有时还是不会显示
09 13th, 2008
用VB测试工程测试VB编写的Dll,为什么不能单步调试Dll里面的代码啊,还望各位网友帮帮忙
1楼的网友,我看不懂你的话啊,很拗口,好像不可操作,代码也只能拷贝到代码,怎能拷贝到Exe里呢 我的QQ:240526133
重新生成DLL,然后选择工程-〉组件-〉二进制兼容。 最后再在exe里引用刚才生成的DLL
3楼,你弄来弄去最后都是编译好的DLL,谈何单步调试, 二进制兼容我都找不到。。。
能不能 QQ 里面谈啊,谢谢你啊
我一般都是把DLL里面的类先放到一EXE工程里面
测试通过后再复制到DLL的工程里编译成DLL
相信一楼也是这个意思
做一工程组,把dll和测试工程都导进来就可以~
7楼正解
7楼说的不对,编译可以通过,但不能单步调试
开两个VB IDE,一个(ActiveX DLL)按F5,"等待创建部件"
另一个(正常),引用上面哪个,进行调试,两个IDE都可以单步执行
不知你明白没有!懒得多打字儿
能用QQ聊吗
你留下你的QQ,我加你
QQ: 240526133
已经说得很明白了………..
顶顶.
你的QQ,我加不上啊,我的850375319,注明:csdn
谢谢各位网友,因为问题不是三言两语可以讲清,谁要知道解决办法可以加我 QQ:240526133 我最擅长解释问题了
09 13th, 2008
用VB测试工程测试VB编写的Dll,为什么不能单步调试Dll里面的代码啊,还望各位网友帮帮忙
1楼的网友,我看不懂你的话啊,很拗口,好像不可操作,代码也只能拷贝到代码,怎能拷贝到Exe里呢 我的QQ:240526133
重新生成DLL,然后选择工程-〉组件-〉二进制兼容。 最后再在exe里引用刚才生成的DLL
3楼,你弄来弄去最后都是编译好的DLL,谈何单步调试, 二进制兼容我都找不到。。。
能不能 QQ 里面谈啊,谢谢你啊
我一般都是把DLL里面的类先放到一EXE工程里面
测试通过后再复制到DLL的工程里编译成DLL
相信一楼也是这个意思
做一工程组,把dll和测试工程都导进来就可以~
7楼正解
7楼说的不对,编译可以通过,但不能单步调试
开两个VB IDE,一个(ActiveX DLL)按F5,"等待创建部件"
另一个(正常),引用上面哪个,进行调试,两个IDE都可以单步执行
不知你明白没有!懒得多打字儿
能用QQ聊吗
你留下你的QQ,我加你
QQ: 240526133
已经说得很明白了………..
顶顶.
你的QQ,我加不上啊,我的850375319,注明:csdn
谢谢各位网友,因为问题不是三言两语可以讲清,谁要知道解决办法可以加我 QQ:240526133 我最擅长解释问题了
08 1st, 2008
lCurLine1 = 1: lCurLine3 = 1: lnextval2 = Val(Range("A2").Text)
Do
If (lnextval2 = 0) Then Exit Do
lCurLine1 = lCurLine1 + 1
lCurLine3 = lCurLine3 + 1
Set objRange = Range("A" & lCurLine1)
Set objRange1 = Range("A" & lCurLine1 + 1)
lnextval1 = Val(objRange.Text)
lnextval2 = Val(objRange1.Text)
If (lnextval1 <> lnextval2) Then
arrCIList1(lCurLine3 - 2) = lnextval1
For w = 0 To 12
If ((objRange.Columns(w + 2).Text) = 0) Then Exit For
arrTmpData2&(lCurLine3 - 2, w) = Val(objRange.Columns(w + 2).Text)
Next
Else
arrCIList1(lCurLine3 - 2) = lnextval1
For w = 0 To 11
If ((objRange.Columns(w + 2).Text) <> 0) Then
arrTmpData2&(lCurLine3 - 2, w) = Val(objRange.Columns(w + 2).Text)
h = h + 1
Else
If ((objRange1.Columns(h + 3).Text) = 0) Then Exit For
arrTmpData2&(lCurLine3 - 2, w) = Val(objRange1.Columns(h + 3).Text)
h = h + 1
End If
Next
lCurLine1 = lCurLine1 + 1
h = 0
End If
Loop While (True)
高手们帮我调试一下,这段代码,为什么不能执行(符合条件) 下面这段代码呢?帮小弟调试一下
If ((objRange1.Columns(h + 3).Text) = 0) Then Exit For
arrTmpData2&(lCurLine3 - 2, w) = Val(objRange1.Columns(h + 3).Text)
h = h + 1
End If
Next
希望高手们留下邮箱,给小弟调试一下。谢谢了
自己先調,把有問題的地方提出來
可能不理解什么意思,不是不会调试~~~~~~~~~~
……………………
大家都理解错误了。
If ((objRange1.Columns(h + 3).Text) = 0) Then Exit For
arrTmpData2&(lCurLine3 - 2, w) = Val(objRange1.Columns(h + 3).Text)
h = h + 1
End If
Next
上面的代码符合条件了也不会执行它。不知道是什么原因
希望高手们留下邮箱,帮一下小弟。
我已经做个好长时间了,就是搞不定。
先谢谢了!!!!!
結構上沒發現問題
你想在什麼情況下,執行哪一句
看来是这句有问题:If ((objRange1.Columns(h + 3).Text) = 0) Then Exit For
各位能不能留一下你们的邮箱呀,字面说不清楚的。
希望高手出现呀
((objRange1.Columns(h + 3).Text) = 0
这个条件永远不满足,
因为.TEXT是文本,0是数值,两者怎么会相等呢?
改成If VAL(objRange1.Columns(h + 3).Text) = 0
或者If Trim(objRange1.Columns(h + 3).Text) = ""
还差不多
07 22nd, 2008
我在用那个可以代替Winsock控件的CSocketMaster类编写一个程序,好不容易解决了支持中文和支持外网的问题,结果又出现一个头疼的问题:在VB的IDE中调试时完全正常,但是编译为exe运行时出现错误被windows的数据执行保护(DEP)关闭–先是弹出DEP的窗口,点确定后我的应用程序弹出那个著名的“遇到问题需要关闭”的窗口,点确定后程序退出,没有更详细的错误信息,估计是对限制的内存执行了写操作。由于调试时正常,所以我现在连什么地方出错的都不知道,我尝试在运行时把可能出错的过程名称写入log文件以供分析,但是根本写不进去,可能是这些过程之间的执行时间间隔太小的原因。大家给想想办法,这样的错误应该怎么来调试啊?
还不确定是什么问题,怪就怪在调试时正常,而编译后每次运行都出错。
那个类模块太长了,看起来都很吃力,调试就更没有头绪了,现在我正把执行到的类中每个sub和function都print到窗体上,看看到底能执行到哪一步再说,唉!这可是个体力活啊。。。-_-!!
设置vb菜单tools/options 在general中选中break on all errors试一试,另外不知道你打了vb的sp6没有,那也有关系。
谢谢,设置发生所有错误时中断也不行,因为我的代码在IDE里面调试时根本不出现任何错误,另外我用的VB6也已经打完sp6补丁。
现在已经知道是在调用完类的connect方法以后马上出现了这个错误,应该就是这个connect的问题,因为我是在一个timer中调用connect的,调用完以后一段时间内根本没有其他操作,但是通过我print出来的东西来看,这个connect已经执行完了,不知道具体是那个语句导致了这个错误。
最新进展:用这个类模块另写了一个测试程序,只保留关键代码,执行同样的connect操作,编译后却怎么也不出现那个错误了,看来是我的程序中其他东西与这个类模块有冲突,明天再慢慢调试吧,睡觉去了。
IDE里面调试时根本不出现任何错误,正是有可能是因为未设置“发生所有错误时中断”。
DEP的话,是CPU的禁止执行功能……
这功能会把某部分的内存设置为不可执行,因此对于注入或溢出的内存块,是无法执行的.
那个类模块我也有,不过我的程序正常.
你试一下把CPU的DEP功能设置为"仅为关键程序启用"看看
我打开这个功能时,连CS都不能打……
而且这个类模块里使用了内嵌汇编技术,估计在受限的操作范围以内.
我把所有错误时中断、类模块中中断、未处理的错误中断三种方式都试过了,都不会出现错误。
我当前的DEP设置就是"仅为基本windows程序和服务启用DEP”,而且今早晨我又在办公室的机子上试验了一下,完全相同的系统版本和DEP设置,连杀毒软件也是相同的,竟然不出现错误了,这两台机子最明显的差别就是配置,我家里内存是2G的,而办公室的是256M的,难道是这个原因?
我的系统版本是XP sp3,DEP设置里面仅有“仅为基本windows程序和服务启用DEP”和“为除下列程序之外的所有程序和服务启用DEP”两项啊,老马说的"仅为关键程序启用"是不是就是第一项?还是另外的系统版本中有"仅为关键程序启用"这么一项啊?
DEP 设置中选“为除下列选定程序之外的所有程序和服务启用DEP”,然后将你的 exe 添加到列表中。
实在没办法的时候就用这一招。
哪位懂汇编的朋友给看看,红色的就是出错的指令:
00172CD1 nop
00172CD2 jae 00172CCE
00172CD5 xchg eax,ebx
00172CD6 jae 00172C93
00172CD9 nop
00172CDA jae 00172CCA
00172CDD jbe 00172D43
00172CDF jae 00172C65
00172CE1 cwde
00172CE2 jae 00172CF0
00172CE5 xchg eax,ecx
00172CE6 jae 00172CF4
00172CE9 xchg eax,ecx
00172CEA jae 00172C87
00172CED xchg eax,esp
00172CEE jae 00172CE3
00172CF1 xchg eax,esp
00172CF2 jae 00172D4D
00172CF5 xchg eax,esp
00172CF6 jae 00172CF9
00172CF9 add byte ptr [eax],al
00172CFB add byte ptr [ebx],dh
00172CFD xchg eax,ebp
00172CFE jae 00172CB1
00172D01 xchg eax,edx
00172D02 jae 00172CEE
00172D05 xchg eax,esi
00172D06 jae 00172D2B
00172D09 xchg eax,edi
00172D0A jae 00172D12
00172D0D xchg eax,ebx
00172D0E jae 00172D29
00172D11 add byte ptr [esi],dl
00172D13 add byte ptr [ecx+eax],ah
00172D16 or al,byte ptr [eax]
00172D18 pop eax
00172D19 push eax
00172D1A push eax
00172D1B push ebp
00172D1C mov ebp,esp
00172D1E push edi
00172D1F push ebx
00172D20 push ecx
00172D21 push edx
00172D22 xor eax,eax
00172D24 jmp 00172D34
00172D26 call 01172D2B
00172D2B cmp eax,2
00172D2E je 00172D52
当时EAX里的值是多少?
对了,不如你试下我这里这个版本的,是封装为一个与WINSOCK控件一模一样的自定义控件了,应该比较方便吧.
MAIL给我….HOHO.
当时eax的值是2147348480
我的邮箱是happy-sea163@sohu.com,谢谢老马!
2147348480是7FFDF000,你在进程挂起时用冰刃看看这段内存里都是些什么东西
另,MAIL已发出,请查收~~
谢谢老马的代码,你发给我的代码中类模块和那个辅助模块跟我现在用的是一样的,但是在调试你的代码时出现问题,缺少声明,我把你注释掉的那些API声明全部恢复以后也不行,有个明明已经声明过的api_GetModuleHandle也提示找不到,因此自定义控件也添加不到窗体上去,而且我不大希望带上一个自定义控件,所以也就没再继续调试。
你说的用冰刃查看内存,我看不懂啊-_-!!
不过既然我那个简单的测试程序编译后没问题,说明这个类模块本身应该没什么问题,但是可以肯定问题就出在这个类模块身上,因为换成winsock控件后问题就没有了,所以最大的可能是这个类模块跟我的应用程序中的某些东西有冲突,我再用排除法一点点减少代码试试看。
NND,终于找到原因了,真是不可思议,竟然是工程属性中产品名称、公司名称、版权、描述等这些东西的问题,我随便改了一下,编译后就没任何问题了。为了再次证明确实是这个原因,我恢复了原来的工程信息,编译运行后同样的问题又出现了,哈哈!
虽然找到了原因,但是打死我也弄不明白这跟那个执行connect方法造成内存写错误有什么联系,VB6真TMD会捉弄人,简直不按路来啊!
谢谢大家的关注和帮助,结贴!
哇哈哈,我忘了我的API全部都用类库声明了~~~那样的话可以在大量调用API时省些开销.
不好意思:)
07 22nd, 2008
我在用那个可以代替Winsock控件的CSocketMaster类编写一个程序,好不容易解决了支持中文和支持外网的问题,结果又出现一个头疼的问题:在VB的IDE中调试时完全正常,但是编译为exe运行时出现错误被windows的数据执行保护(DEP)关闭–先是弹出DEP的窗口,点确定后我的应用程序弹出那个著名的“遇到问题需要关闭”的窗口,点确定后程序退出,没有更详细的错误信息,估计是对限制的内存执行了写操作。由于调试时正常,所以我现在连什么地方出错的都不知道,我尝试在运行时把可能出错的过程名称写入log文件以供分析,但是根本写不进去,可能是这些过程之间的执行时间间隔太小的原因。大家给想想办法,这样的错误应该怎么来调试啊?
还不确定是什么问题,怪就怪在调试时正常,而编译后每次运行都出错。
那个类模块太长了,看起来都很吃力,调试就更没有头绪了,现在我正把执行到的类中每个sub和function都print到窗体上,看看到底能执行到哪一步再说,唉!这可是个体力活啊。。。-_-!!
设置vb菜单tools/options 在general中选中break on all errors试一试,另外不知道你打了vb的sp6没有,那也有关系。
谢谢,设置发生所有错误时中断也不行,因为我的代码在IDE里面调试时根本不出现任何错误,另外我用的VB6也已经打完sp6补丁。
现在已经知道是在调用完类的connect方法以后马上出现了这个错误,应该就是这个connect的问题,因为我是在一个timer中调用connect的,调用完以后一段时间内根本没有其他操作,但是通过我print出来的东西来看,这个connect已经执行完了,不知道具体是那个语句导致了这个错误。
最新进展:用这个类模块另写了一个测试程序,只保留关键代码,执行同样的connect操作,编译后却怎么也不出现那个错误了,看来是我的程序中其他东西与这个类模块有冲突,明天再慢慢调试吧,睡觉去了。
IDE里面调试时根本不出现任何错误,正是有可能是因为未设置“发生所有错误时中断”。
DEP的话,是CPU的禁止执行功能……
这功能会把某部分的内存设置为不可执行,因此对于注入或溢出的内存块,是无法执行的.
那个类模块我也有,不过我的程序正常.
你试一下把CPU的DEP功能设置为"仅为关键程序启用"看看
我打开这个功能时,连CS都不能打……
而且这个类模块里使用了内嵌汇编技术,估计在受限的操作范围以内.
我把所有错误时中断、类模块中中断、未处理的错误中断三种方式都试过了,都不会出现错误。
我当前的DEP设置就是"仅为基本windows程序和服务启用DEP”,而且今早晨我又在办公室的机子上试验了一下,完全相同的系统版本和DEP设置,连杀毒软件也是相同的,竟然不出现错误了,这两台机子最明显的差别就是配置,我家里内存是2G的,而办公室的是256M的,难道是这个原因?
我的系统版本是XP sp3,DEP设置里面仅有“仅为基本windows程序和服务启用DEP”和“为除下列程序之外的所有程序和服务启用DEP”两项啊,老马说的"仅为关键程序启用"是不是就是第一项?还是另外的系统版本中有"仅为关键程序启用"这么一项啊?
DEP 设置中选“为除下列选定程序之外的所有程序和服务启用DEP”,然后将你的 exe 添加到列表中。
实在没办法的时候就用这一招。
哪位懂汇编的朋友给看看,红色的就是出错的指令:
00172CD1 nop
00172CD2 jae 00172CCE
00172CD5 xchg eax,ebx
00172CD6 jae 00172C93
00172CD9 nop
00172CDA jae 00172CCA
00172CDD jbe 00172D43
00172CDF jae 00172C65
00172CE1 cwde
00172CE2 jae 00172CF0
00172CE5 xchg eax,ecx
00172CE6 jae 00172CF4
00172CE9 xchg eax,ecx
00172CEA jae 00172C87
00172CED xchg eax,esp
00172CEE jae 00172CE3
00172CF1 xchg eax,esp
00172CF2 jae 00172D4D
00172CF5 xchg eax,esp
00172CF6 jae 00172CF9
00172CF9 add byte ptr [eax],al
00172CFB add byte ptr [ebx],dh
00172CFD xchg eax,ebp
00172CFE jae 00172CB1
00172D01 xchg eax,edx
00172D02 jae 00172CEE
00172D05 xchg eax,esi
00172D06 jae 00172D2B
00172D09 xchg eax,edi
00172D0A jae 00172D12
00172D0D xchg eax,ebx
00172D0E jae 00172D29
00172D11 add byte ptr [esi],dl
00172D13 add byte ptr [ecx+eax],ah
00172D16 or al,byte ptr [eax]
00172D18 pop eax
00172D19 push eax
00172D1A push eax
00172D1B push ebp
00172D1C mov ebp,esp
00172D1E push edi
00172D1F push ebx
00172D20 push ecx
00172D21 push edx
00172D22 xor eax,eax
00172D24 jmp 00172D34
00172D26 call 01172D2B
00172D2B cmp eax,2
00172D2E je 00172D52
当时EAX里的值是多少?
对了,不如你试下我这里这个版本的,是封装为一个与WINSOCK控件一模一样的自定义控件了,应该比较方便吧.
MAIL给我….HOHO.
当时eax的值是2147348480
我的邮箱是happy-sea163@sohu.com,谢谢老马!
2147348480是7FFDF000,你在进程挂起时用冰刃看看这段内存里都是些什么东西
另,MAIL已发出,请查收~~
谢谢老马的代码,你发给我的代码中类模块和那个辅助模块跟我现在用的是一样的,但是在调试你的代码时出现问题,缺少声明,我把你注释掉的那些API声明全部恢复以后也不行,有个明明已经声明过的api_GetModuleHandle也提示找不到,因此自定义控件也添加不到窗体上去,而且我不大希望带上一个自定义控件,所以也就没再继续调试。
你说的用冰刃查看内存,我看不懂啊-_-!!
不过既然我那个简单的测试程序编译后没问题,说明这个类模块本身应该没什么问题,但是可以肯定问题就出在这个类模块身上,因为换成winsock控件后问题就没有了,所以最大的可能是这个类模块跟我的应用程序中的某些东西有冲突,我再用排除法一点点减少代码试试看。
NND,终于找到原因了,真是不可思议,竟然是工程属性中产品名称、公司名称、版权、描述等这些东西的问题,我随便改了一下,编译后就没任何问题了。为了再次证明确实是这个原因,我恢复了原来的工程信息,编译运行后同样的问题又出现了,哈哈!
虽然找到了原因,但是打死我也弄不明白这跟那个执行connect方法造成内存写错误有什么联系,VB6真TMD会捉弄人,简直不按路来啊!
谢谢大家的关注和帮助,结贴!
如需要阅读该回复,请