VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: 19900603

Vb内嵌汇编+标准Dll插件 开源

  [复制链接]
发表于 2012-11-11 22:36:56 | 显示全部楼层
本帖最后由 zhang_game 于 2012-11-12 12:37 编辑

不能用的问题解决了,但是有又一个新问题出现了
  1. Public Function shlN(ByVal a As Long, ByVal b As Long) As Long
  2. '#ASM mov eax,[esp+4]
  3. '#ASM mov ecx,[esp+8]
  4. '#ASM shl eax,cl
  5. '#ASM ret 8
  6. End Function

  7. Private Sub Command1_Click()
  8. MsgBox shlN(20, 2)
  9. End Sub
复制代码
这个代码,我放在EXE中编译,就正常,但放入DLL中,再将DLL注入到其它EXE中再运行,就不行了,何解?

好像就是如果生成标准DLL,有汇编模块的话,插件不会编译这个汇编模块一样!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 11:34:15 | 显示全部楼层
@19900603 换了个XP 系统也无法使用汇编模块。编译时会卡住不动。兼容性好像有待提高!
回复 支持 反对

使用道具 举报

发表于 2013-6-5 20:08:49 | 显示全部楼层
死在了这个函数 无限循环
回复 支持 反对

使用道具 举报

发表于 2013-6-5 20:09:10 | 显示全部楼层
Public Function GetCmdRet(CdPath As String, Cmd As String)
    '   On Error Resume Next
    Dim Buf As String, FileName As String
    'OnStart:
    '    If CmdIng Then GoTo OnStart
    '    MsgBox Buf
    CmdIng = True
    VBA.Randomize
    '随机文件名
    FileName = Rnd(50000) & ".txt"
    '进入目录
    Buf = "cd /d " & CdPath & vbCrLf
    '执行命令并把结果保存到指定文件
    Buf = Buf & Cmd & " > " & FileName & vbCrLf
    '删除自身
    Buf = Buf & "del %0 /q"
    '保存命令行文本
    SaveTxt CdPath & "Cmd.Bat", Buf
    '启动命令行
    MsgBox 1
    Call ShellExecute(GetDesktopWindow, "Open", CdPath & "Cmd.Bat", "", CdPath, vbHide)
    '等待 命令行的完成
    MsgBox 2
    Do
RetRead:
        DoEvents
        If Dir(CdPath & FileName) <> "" Then
         
            If FileLen(CdPath & FileName) > 0 Then
               
                '命令已完成  读取内容
                GetCmdRet = GetTxt(CdPath & FileName)
               
                '删掉文件
                Kill CdPath & FileName
                '如果删除失败那么重新读取

                If Dir(CdPath & FileName) <> "" Then GoTo RetRead
                '返回
                CmdIng = False
                Exit Function
                Exit Do
            End If
        End If
    Loop
End Function
死在了 无限循环!!

点评

还有几处If ModuleName = ASMModuleName Then 无法对比 我改成这样If UCase(ModuleName) = ASMModuleName Then  发表于 2013-6-5 22:58
貌似 If FileLen(CdPath & FileName) > 0 Then 这个文件内容为0  发表于 2013-6-5 22:52
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-6 02:49:13 | 显示全部楼层
qq275158045 发表于 2013-6-5 20:09
Public Function GetCmdRet(CdPath As String, Cmd As String)
    '   On Error Resume Next
    Dim Bu ...

'调用命令行 并返回结果
Public Function GetCmdRet(CdPath As String, Cmd As String)
    '   On Error Resume Next
    Dim Buf As String, FileName As String, SuperTime As Balloon
    'OnStart:
    '    If CmdIng Then GoTo OnStart
    '    MsgBox Buf
    CmdIng = True
    VBA.Randomize
    '随机文件名
    FileName = Int(Rnd() * 5000000 + 1234) & ".txt"
    '进入目录
    Buf = "cd /d " & CdPath & vbCrLf

    '执行命令并把结果保存到指定文件
    Buf = Buf & Cmd & " > " & FileName & vbCrLf
    '删除自身
    'DebugStr "G-1"
Fand:

    If Not SaveTxt(CdPath & "Cmd.Bat", Buf) Then GoTo Fand
    'DebugStr "Cmd.Bat内容:" & GetTxt(CdPath & "Cmd.Bat")
    'DebugStr "运行Cmd.Bat"
    Dim ShellRet As Long
    ShellRet = ShellExecute(GetDesktopWindow, "Open", CdPath & "Cmd.Bat", "", CdPath, vbHide)
    Select Case ShellRet
        Case 2
            Rem 文件名 错误 重新保存
            DebugStr "ShellExecute打开Bat错误重新保存 Cmd.Bat"
            GoTo Fand
        Case 3
            DebugStr "ShellExecute路径名错误"
        Case 11
            DebugStr "ShellExecuteExe无效"
    End Select
    '等待 命令行的完成
    DebugStr "G-3"
    Dim Timer As Long
    Timer = GetTickCount
    Do
RetRead:
        DoEvents
        If GetTickCount - Timer > 2000 Then SuperTime = True: GoTo CmdOk
        If Dir(CdPath & FileName) <> "" Then
            If FileLen(CdPath & FileName) > 0 Then
CmdOk:
                DebugStr "G-4"
                '命令已完成  读取内容
                GetCmdRet = GetTxt(CdPath & FileName)
                '删掉文件
                DelFile CdPath & FileName
                DelFile CdPath & "Cmd.Bat"
                '如果删除失败那么重新读取
                '    If Dir(CdPath & FileName) <> "" Then GoTo RetRead
                '返回
                CmdIng = False
                DebugStr "G-5"
                '启动命令行
                DelFile CdPath & "Cmd.Bat"
                '   DebugStr FileLen(CdPath & ASMModuleName & ".Lst")
                Exit Function
            End If
        End If
    Loop
End Function

点评

SaveTxt 函数要怎么改函数的返回?  发表于 2013-6-6 10:11
回复 支持 反对

使用道具 举报

发表于 2013-6-6 15:34:19 | 显示全部楼层



附上改后的文件 和生成的文件。以本贴移位操作为例。

还不了解 Cmd.Bat 和    FileName = Int(Rnd() * 5000000 + 1234) & ".txt"  生成的问题件有什么关联。但生成的TXT里面是没内容的。劫持了ML.exe 是有消息发送过去的,但不知道返回了没有。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-7 00:27:20 | 显示全部楼层
qq275158045 发表于 2013-6-6 15:34
附上改后的文件 和生成的文件。以本贴移位操作为例。

还不了解 Cmd.Bat 和    FileName = Int(Rnd ...

没想到 这么久了还有人会喜欢。。。 更新后代码。。。 细节方面未更新 代码烂 勿拍

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

看100楼.........需要附件  发表于 2013-6-7 10:14
嗯 一点小地方需要用到汇编,不用很不麻烦。再次感谢!  发表于 2013-6-7 08:18
回复 支持 反对

使用道具 举报

发表于 2013-6-7 08:45:37 | 显示全部楼层
19900603 发表于 2013-6-7 00:27
没想到 这么久了还有人会喜欢。。。 更新后代码。。。 细节方面未更新 代码烂 勿拍

Call CallCmdRet(Vb6Path, "RC /r /fo " & "Resource.Res " & "Resource.rc" & vbCrLf & "cvtres /OUT:Resource.Obj  Resource.Res")
               
OnStar:                                                                         '等待Obj编译完成

好像无法生成,所以无限循环了。再次汇报BUG 自己也试试解决。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-7 10:11:10 | 显示全部楼层
本帖最后由 19900603 于 2013-6-7 10:13 编辑
qq275158045 发表于 2013-6-7 08:45
Call CallCmdRet(Vb6Path, "RC /r /fo " & "Resource.Res " & "Resource.rc" & vbCrLf & "cvtres /OUT:Re ...


对了 。。。
把 \Microsoft Visual Studio\VB98\Wizards 目录的  rc.exe  和 rcdd.dll
复制到 \Microsoft Visual Studio\VB98 目录。。。。

把 cvtres.exe 放到 \Microsoft Visual Studio\VB98 目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2013-6-7 11:05:32 | 显示全部楼层
19900603 发表于 2013-6-7 10:11
对了 。。。
把 \Microsoft Visual Studio\VB98\Wizards 目录的  rc.exe  和 rcdd.dll
复制到 \Micro ...

已经用了的!奇怪就好像无法生成那个 Resource.Obj  
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-6-26 23:10

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表