[求助]在DLL中用创建了Excel的对象,如何更改其内存空间中的内容。

o大耳鼠o 2018-03-13 01:41:01
从stackoverflow https://stackoverflow.com/questions/1026483/is-there-a-way-to-crack-the-password-on-an-excel-vba-project上面找到一段代码,用于解锁Excel VBA的项目保护,在excel里面试用了一下,没有问题。

后来想把这段代码封装到dll里面,在dll里面创建了一个excel的对象 :
Set oXL = CreateObject("Excel.Application")
,再在DLL里面运行上面那段代码,发现启动的Excel不具备解锁项目的功能。

想了一下,估计是内存空间的问题,也就是只有在Excel自己的内存空间里面修改内存的值,才可以。现在想请教怎样在DLL里面,修改刚才启动的Excel的内存值。

之前试过一个方法,就是利用VBA的VBE对象,动态添加代码,然后运行,但是一旦把添加的代码删除,excel就会卡死,但是不删掉,又起不到封装的目的。

谢谢大家了。
...全文
713 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
o大耳鼠o 2018-03-16
  • 打赏
  • 举报
回复
引用 22 楼 Chen8013 的回复:
刚才特意进入Win10系统,去截了个图: 都是“文件找不到”…… 但实际“完整路径”指定的文件是存在的。
嗯,确实有一些东西可能补一点一点追踪,根本找不到原因。 我分享一下自己用的那个Reg-Free的方法,已经试验成功了。 https://msdn.microsoft.com/en-us/library/ms973913.aspx
舉杯邀明月 2018-03-16
  • 打赏
  • 举报
回复
刚才特意进入Win10系统,去截了个图:


都是“文件找不到”……
但实际“完整路径”指定的文件是存在的。
舉杯邀明月 2018-03-16
  • 打赏
  • 举报
回复
仔细想了一下: 我用VB6编译出来的是32位dll,它应该不能被64位的VBA7调用; VBA代码的API声明: Private Declare PtrSafe Function FreeProtect Lib "VBA.dll" () As Long   其实它应该是会加载System32目录中的VBA.dll,而不是SysWOW64目录中的VBA.dll。 因此19楼截图中的错误代码是“53”:确实没有对应的文件,所以找不到; 而之前API声明写的“完整路径”时,它的错误代码是“48”,是不同的。 (我在Win10中测试、后来截图时没有注意到错误代码不同。先前才看到的……)
o大耳鼠o 2018-03-16
  • 打赏
  • 举报
回复
引用 19 楼 Chen8013 的回复:
我这儿在2010下的测试结果,不是“卡死”,而是Excel崩溃。 写了些测试代码来验证,找到在“2010”下,“DLL代码”的问题有: 1. 不能访问“数组”; 2. 不能调用 “使用Declare声明的API函数”。 对于“问题1”,还很好解决:  定义一个“自定义数据类型”,把那个“缓冲区数组”嵌入到这个“类型”中,就可以“正常访问数组成员”了。 对于“问题2”,我给你的建议,是把需要用到的API,写个“TLB”来引用。这个方法比较容易实现。 我今天修改后编译的dll,在 Win7(32位,专业版)+ Office 2010下测试,完全正常。 但是,在Win10(64位)+ Office 2010(64位)下测试,却总是提示这个错误: 暂时还不知道为何总是提示“找不到文件”: 开始,VBA.dll文件是放在E盘中的,在API声明那儿给出了“完整路径”; 然后,我把VBA.dll复制到SysWOW64目录中(当然,“lib”就不带路径了),它仍然“找不到文件”。 这个“标准DLL”,我是在Win7(64位,旗舰版)+VB6企业版下编译的。 (不过编译时没有写12楼那几个API的TLB,是用另外的手段处理“Declare 声明的调用”的)
引用 19 楼 Chen8013 的回复:
我这儿在2010下的测试结果,不是“卡死”,而是Excel崩溃。 写了些测试代码来验证,找到在“2010”下,“DLL代码”的问题有: 1. 不能访问“数组”; 2. 不能调用 “使用Declare声明的API函数”。 对于“问题1”,还很好解决:  定义一个“自定义数据类型”,把那个“缓冲区数组”嵌入到这个“类型”中,就可以“正常访问数组成员”了。 对于“问题2”,我给你的建议,是把需要用到的API,写个“TLB”来引用。这个方法比较容易实现。 我今天修改后编译的dll,在 Win7(32位,专业版)+ Office 2010下测试,完全正常。 但是,在Win10(64位)+ Office 2010(64位)下测试,却总是提示这个错误: 暂时还不知道为何总是提示“找不到文件”: 开始,VBA.dll文件是放在E盘中的,在API声明那儿给出了“完整路径”; 然后,我把VBA.dll复制到SysWOW64目录中(当然,“lib”就不带路径了),它仍然“找不到文件”。 这个“标准DLL”,我是在Win7(64位,旗舰版)+VB6企业版下编译的。 (不过编译时没有写12楼那几个API的TLB,是用另外的手段处理“Declare 声明的调用”的)
非常感谢,我去试试看。也学习下TLB的使用方法
舉杯邀明月 2018-03-16
  • 打赏
  • 举报
回复
我这儿在2010下的测试结果,不是“卡死”,而是Excel崩溃。


写了些测试代码来验证,找到在“2010”下,“DLL代码”的问题有:
1. 不能访问“数组”;
2. 不能调用 “使用Declare声明的API函数”。

对于“问题1”,还很好解决:
 定义一个“自定义数据类型”,把那个“缓冲区数组”嵌入到这个“类型”中,就可以“正常访问数组成员”了。

对于“问题2”,我给你的建议,是把需要用到的API,写个“TLB”来引用。这个方法比较容易实现。

我今天修改后编译的dll,在 Win7(32位,专业版)+ Office 2010下测试,完全正常。
但是,在Win10(64位)+ Office 2010(64位)下测试,却总是提示这个错误:

暂时还不知道为何总是提示“找不到文件”:
开始,VBA.dll文件是放在E盘中的,在API声明那儿给出了“完整路径”;
然后,我把VBA.dll复制到SysWOW64目录中(当然,“lib”就不带路径了),它仍然“找不到文件”。

这个“标准DLL”,我是在Win7(64位,旗舰版)+VB6企业版下编译的。
(不过编译时没有写12楼那几个API的TLB,是用另外的手段处理“Declare 声明的调用”的)
舉杯邀明月 2018-03-15
  • 打赏
  • 举报
回复
我平时都登录的Win7系统。这个系统下安装的是 Office 2007(32位的)。 在Win10系统中,我才是安装的2010(64位),不过我很少登录Win10,以后有空我试试能不能找到原因。 你也可以先试试你在主贴中说的那个代码,在2010中能不能正常使用。
舉杯邀明月 2018-03-15
  • 打赏
  • 举报
回复
不知道你说的2010是32位还是64位的?
o大耳鼠o 2018-03-15
  • 打赏
  • 举报
回复
引用 12 楼 Chen8013 的回复:
我的测试用的DLL主要代码如下:
Option Explicit

Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" ( _
                           ByRef Dest As Any, _
                           ByRef Sour As Any, _
                           ByVal Size As Long)

Private Declare Function VirtualProtect Lib "Kernel32" ( _
                           ByVal lpAddress As Long, _
                           ByVal dwSize As Long, _
                           ByVal flNewProtect As Long, _
                           ByRef lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleW Lib "Kernel32" ( _
                           ByVal lpModuleName As Long) As Long
Private Declare Function GetProcAddress Lib "Kernel32" ( _
                           ByVal hModule As Long, _
                           ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "User32" Alias "DialogBoxParamW" ( _
                           ByVal hInstance As Long, _
                           ByVal pTemplateName As Long, _
                           ByVal hWndParent As Long, _
                           ByVal lpDialogFunc As Long, _
                           ByVal dwInitParam As Long) As Long

Private mlFlag As Long


Private Function FreeProtect() As Long
   If (mlFlag) Then
      FreeProtect = 1&
   Else
      FreeProtect = HookAPI()
   End If
End Function

Private Function GetPtr(ByVal Value As Long) As Long
    GetPtr = Value
End Function

Private Function HookAPI() As Long
   Dim arrBuff(5) As Byte
   Dim hModule As Long
   Dim lpFunc  As Long
   Dim lRetVal As Long
   Dim p&, w   As Long

   lRetVal = vbTrue
   hModule = GetModuleHandleW(StrPtr("user32.dll"))
   lpFunc = GetProcAddress(hModule, "DialogBoxParamA")
   If (0& = VirtualProtect(ByVal lpFunc, 6&, &H40, w)) Then GoTo E_FinalExit
   Call CopyMemory(arrBuff(0&), ByVal lpFunc, 1&)
   If (&H68 = arrBuff(0)) Then
      lRetVal = 1&
   Else
      p = GetPtr(AddressOf MyDialogBoxParam)
      Call CopyMemory(arrBuff(1&), p, 4&)
      arrBuff(0) = &H68
      arrBuff(5) = &HC3
      Call CopyMemory(ByVal lpFunc, arrBuff(0&), 6&)
      lRetVal = vbFalse
      mlFlag = vbTrue
   End If
   Call VirtualProtect(ByVal lpFunc, 6&, w, 0&)

E_FinalExit:
   HookAPI = lRetVal
End Function

Private Function MyDialogBoxParam(ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Long

   If (4070& = pTemplateName) Then
      MyDialogBoxParam = 1&
   Else
      MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam)
   End If
End Function
此处共4个函数,其中 FreeProtect( ) 是导出函数,其它3个只是辅助函数(不导出的)。 调用FreeProtect( ) 操作成功返回0、操作失败返回-1; 如果“已经成功执行”后再次(或多次)被调用,则返回值是1(当然你也可以改为其它值)。 这段代码,编译成“标准dll”只用于VBA环境中调用; 若在其它环境中使用则不保证“安全性”。
在Excel 2007里面运行非常成功,但是一旦在excel 2010以上运行,就会造成excel卡死的现象,真的不知道为什么。
o大耳鼠o 2018-03-15
  • 打赏
  • 举报
回复
引用 12 楼 Chen8013 的回复:
我的测试用的DLL主要代码如下:
Option Explicit

Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" ( _
                           ByRef Dest As Any, _
                           ByRef Sour As Any, _
                           ByVal Size As Long)

Private Declare Function VirtualProtect Lib "Kernel32" ( _
                           ByVal lpAddress As Long, _
                           ByVal dwSize As Long, _
                           ByVal flNewProtect As Long, _
                           ByRef lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleW Lib "Kernel32" ( _
                           ByVal lpModuleName As Long) As Long
Private Declare Function GetProcAddress Lib "Kernel32" ( _
                           ByVal hModule As Long, _
                           ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "User32" Alias "DialogBoxParamW" ( _
                           ByVal hInstance As Long, _
                           ByVal pTemplateName As Long, _
                           ByVal hWndParent As Long, _
                           ByVal lpDialogFunc As Long, _
                           ByVal dwInitParam As Long) As Long

Private mlFlag As Long


Private Function FreeProtect() As Long
   If (mlFlag) Then
      FreeProtect = 1&
   Else
      FreeProtect = HookAPI()
   End If
End Function

Private Function GetPtr(ByVal Value As Long) As Long
    GetPtr = Value
End Function

Private Function HookAPI() As Long
   Dim arrBuff(5) As Byte
   Dim hModule As Long
   Dim lpFunc  As Long
   Dim lRetVal As Long
   Dim p&, w   As Long

   lRetVal = vbTrue
   hModule = GetModuleHandleW(StrPtr("user32.dll"))
   lpFunc = GetProcAddress(hModule, "DialogBoxParamA")
   If (0& = VirtualProtect(ByVal lpFunc, 6&, &H40, w)) Then GoTo E_FinalExit
   Call CopyMemory(arrBuff(0&), ByVal lpFunc, 1&)
   If (&H68 = arrBuff(0)) Then
      lRetVal = 1&
   Else
      p = GetPtr(AddressOf MyDialogBoxParam)
      Call CopyMemory(arrBuff(1&), p, 4&)
      arrBuff(0) = &H68
      arrBuff(5) = &HC3
      Call CopyMemory(ByVal lpFunc, arrBuff(0&), 6&)
      lRetVal = vbFalse
      mlFlag = vbTrue
   End If
   Call VirtualProtect(ByVal lpFunc, 6&, w, 0&)

E_FinalExit:
   HookAPI = lRetVal
End Function

Private Function MyDialogBoxParam(ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Long

   If (4070& = pTemplateName) Then
      MyDialogBoxParam = 1&
   Else
      MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam)
   End If
End Function
此处共4个函数,其中 FreeProtect( ) 是导出函数,其它3个只是辅助函数(不导出的)。 调用FreeProtect( ) 操作成功返回0、操作失败返回-1; 如果“已经成功执行”后再次(或多次)被调用,则返回值是1(当然你也可以改为其它值)。 这段代码,编译成“标准dll”只用于VBA环境中调用; 若在其它环境中使用则不保证“安全性”。
谢谢
o大耳鼠o 2018-03-15
  • 打赏
  • 举报
回复
引用 17 楼 Chen8013 的回复:
我平时都登录的Win7系统。这个系统下安装的是 Office 2007(32位的)。 在Win10系统中,我才是安装的2010(64位),不过我很少登录Win10,以后有空我试试能不能找到原因。 你也可以先试试你在主贴中说的那个代码,在2010中能不能正常使用。
我机器里面的2010和2013都是32位的,所以不需要safeptr的引用,但是excel会卡死
舉杯邀明月 2018-03-14
  • 打赏
  • 举报
回复
引用 4 楼 sniperhgy 的回复:
@举杯邀明月 谢谢回应,但是如果只是Hook了API,为何在Excel里面运行就可以,但是在VB里面就不行了呢?请指教。谢谢。
我开始以为个是“全局HOOK”呢,但刚才试了一下,发现“并不是”。 试验方法如下: 1. 做了一个简单的、带“密码保护VBA工程”的xls文档来测试。 2. 用Excel(2007,32位的)打开文档来测试, 表现“正常”:查看VBA代码需要密码。 3. 启动VB6,在VB6的IDE下运行“破解密码保护”的代码。   跟踪执行过程,都是“操作成功”了的。 4. 再回到Excel的VBE中查看之前的“VBA工程”,仍然是需要密码的。 5. 新建一个文档、插入“破解代码”执行。再去查看之前的“VBA工程”,现在已经不用输密码就能看了………… 经上面的试验,觉得这个不是全局HOOK、是跟“进程空间”有关的…… (虽然在VB6和VBE中,GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")的返回值是相同的) 因此,我觉得: 你封装成DLL,然后在“它”里面创建Excel对象, 你这个“加载DLL的进程”(无论你是用VB6程序来调用,还是在VBA代码中调用),   与“创建的Excel对象的进程”,并不是“同一个进程空间”的,因此没有效果。 你在楼上说的“因为VB的DLL都是ActiveX的DLL”,这个也不对啊…… VB6“原生环境”确实是只支持 ActiveX DLL ; 不过,我早就发布了一个工具,可以让VB6编译 Standard Call的DLL了。 对于64位的Excel,我没试过。 不过对于32位的Excel,我觉得完全可以“封装”到DLL中, 通过“利用VBA的VBE对象,动态添加代码,调用‘破解’接口”的方法来处理。
o大耳鼠o 2018-03-14
  • 打赏
  • 举报
回复
@举杯邀明月 谢谢回应,但是如果只是Hook了API,为何在Excel里面运行就可以,但是在VB里面就不行了呢?请指教。谢谢。
o大耳鼠o 2018-03-14
  • 打赏
  • 举报
回复
@舉杯邀明月 至于为何要在DLL生成excel对象,是这样的:因为VB的DLL都是ActiveX的DLL,所以为了让它可以跨机器运行,我就只能写Manifest来让它可以standalone起来。而Excel分为32位和64位的,所以我在DLL里面写了一些语句好让它可以根据Excel的版本运行不同的function
舉杯邀明月 2018-03-14
  • 打赏
  • 举报
回复
我的测试用的DLL主要代码如下:
Option Explicit

Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" ( _
                           ByRef Dest As Any, _
                           ByRef Sour As Any, _
                           ByVal Size As Long)

Private Declare Function VirtualProtect Lib "Kernel32" ( _
                           ByVal lpAddress As Long, _
                           ByVal dwSize As Long, _
                           ByVal flNewProtect As Long, _
                           ByRef lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleW Lib "Kernel32" ( _
                           ByVal lpModuleName As Long) As Long
Private Declare Function GetProcAddress Lib "Kernel32" ( _
                           ByVal hModule As Long, _
                           ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "User32" Alias "DialogBoxParamW" ( _
                           ByVal hInstance As Long, _
                           ByVal pTemplateName As Long, _
                           ByVal hWndParent As Long, _
                           ByVal lpDialogFunc As Long, _
                           ByVal dwInitParam As Long) As Long

Private mlFlag As Long


Private Function FreeProtect() As Long
   If (mlFlag) Then
      FreeProtect = 1&
   Else
      FreeProtect = HookAPI()
   End If
End Function

Private Function GetPtr(ByVal Value As Long) As Long
    GetPtr = Value
End Function

Private Function HookAPI() As Long
   Dim arrBuff(5) As Byte
   Dim hModule As Long
   Dim lpFunc  As Long
   Dim lRetVal As Long
   Dim p&, w   As Long

   lRetVal = vbTrue
   hModule = GetModuleHandleW(StrPtr("user32.dll"))
   lpFunc = GetProcAddress(hModule, "DialogBoxParamA")
   If (0& = VirtualProtect(ByVal lpFunc, 6&, &H40, w)) Then GoTo E_FinalExit
   Call CopyMemory(arrBuff(0&), ByVal lpFunc, 1&)
   If (&H68 = arrBuff(0)) Then
      lRetVal = 1&
   Else
      p = GetPtr(AddressOf MyDialogBoxParam)
      Call CopyMemory(arrBuff(1&), p, 4&)
      arrBuff(0) = &H68
      arrBuff(5) = &HC3
      Call CopyMemory(ByVal lpFunc, arrBuff(0&), 6&)
      lRetVal = vbFalse
      mlFlag = vbTrue
   End If
   Call VirtualProtect(ByVal lpFunc, 6&, w, 0&)

E_FinalExit:
   HookAPI = lRetVal
End Function

Private Function MyDialogBoxParam(ByVal hInstance As Long, _
        ByVal pTemplateName As Long, ByVal hWndParent As Long, _
        ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Long

   If (4070& = pTemplateName) Then
      MyDialogBoxParam = 1&
   Else
      MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, hWndParent, lpDialogFunc, dwInitParam)
   End If
End Function
此处共4个函数,其中 FreeProtect( ) 是导出函数,其它3个只是辅助函数(不导出的)。 调用FreeProtect( ) 操作成功返回0、操作失败返回-1; 如果“已经成功执行”后再次(或多次)被调用,则返回值是1(当然你也可以改为其它值)。 这段代码,编译成“标准dll”只用于VBA环境中调用; 若在其它环境中使用则不保证“安全性”。
o大耳鼠o 2018-03-14
  • 打赏
  • 举报
回复
@舉杯邀明月 请问能分享一下源码吗?谢谢了。
o大耳鼠o 2018-03-14
  • 打赏
  • 举报
回复
引用 9 楼 Chen8013 的回复:
所以: 其实要用“dll封装(方法保密)”,无论用ActiveX DLL,还是“标准DLL”,都是用不着在dll中创建对象的。 只需要“获取Excel对象”(当“获取”不成功,再创建并启动Excel对象进程), 然后用它来“新建”一个文档、动态添加代码、执行“解除保护”的调用操作、   然后把这个“新建文档”隐藏,就不影响用户操作了。 (最好是在“工作簿关闭”的事件代码中,调用“还原”的操作代码)
谢谢你写的范例。我去学习一下。
舉杯邀明月 2018-03-14
  • 打赏
  • 举报
回复
所以: 其实要用“dll封装(方法保密)”,无论用ActiveX DLL,还是“标准DLL”,都是用不着在dll中创建对象的。 只需要“获取Excel对象”(当“获取”不成功,再创建并启动Excel对象进程), 然后用它来“新建”一个文档、动态添加代码、执行“解除保护”的调用操作、   然后把这个“新建文档”隐藏,就不影响用户操作了。 (最好是在“工作簿关闭”的事件代码中,调用“还原”的操作代码)
舉杯邀明月 2018-03-14
  • 打赏
  • 举报
回复
我不知道你的“标准DLL”是怎么写的。 不过,我刚才写了个简单的DLL,并且测试了一下,是没有问题的。 dll文件可以在我的百度网盘下载,分享链接: https://pan.baidu.com/s/1LLMg22L0c4bMKznHLf8rEA 提取密码: ptk5 测试方法及代码(我的测试环境:Win7旗舰版64位 + 32位的Excel 2007): 1. 打开带“密码保护VBA工程”的 .xls 文档。 2. 新建一个空白文档,打开VBE,插入模块,添加如下代码,并执行(一般都是“操作成功”的)。
Option Explicit

' DLL文件路径,按“实际情况”写,才能保存正常加载。
' 否则,可能只有放到System32(或SysWOW64)中,才能“省略路径”。
Private Declare Function FreeProtect Lib "E:\Temp\VBA.dll" () As Long

Private Sub Main()
   Select Case FreeProtect()
      Case 0&:    Debug.Print "“密码保护”解除操作成功。"
      Case 1&:    Debug.Print "“密码保护”已经成功解除了。"
      Case Else:  Debug.Print "操作失败……"    ' 返回值 = -1
   End Select
End Sub
3. “操作成功”后,查看带“密码保护VBA工程”的代码时,已经不用输入密码了。 当然,这个dll没有写“还原”的接口,因此只能“退出Excel时才关闭”那个“新建文档”。 否则,会造成Excel崩溃。 (因为“关闭”时,dll释放了,而HOOK没有还原,会造成非法内存访问。)
o大耳鼠o 2018-03-14
  • 打赏
  • 举报
回复
引用 6 楼 Chen8013 的回复:
[quote=引用 4 楼 sniperhgy 的回复:] @举杯邀明月 谢谢回应,但是如果只是Hook了API,为何在Excel里面运行就可以,但是在VB里面就不行了呢?请指教。谢谢。
我开始以为个是“全局HOOK”呢,但刚才试了一下,发现“并不是”。 试验方法如下: 1. 做了一个简单的、带“密码保护VBA工程”的xls文档来测试。 2. 用Excel(2007,32位的)打开文档来测试, 表现“正常”:查看VBA代码需要密码。 3. 启动VB6,在VB6的IDE下运行“破解密码保护”的代码。   跟踪执行过程,都是“操作成功”了的。 4. 再回到Excel的VBE中查看之前的“VBA工程”,仍然是需要密码的。 5. 新建一个文档、插入“破解代码”执行。再去查看之前的“VBA工程”,现在已经不用输密码就能看了………… 经上面的试验,觉得这个不是全局HOOK、是跟“进程空间”有关的…… (虽然在VB6和VBE中,GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")的返回值是相同的) 因此,我觉得: 你封装成DLL,然后在“它”里面创建Excel对象, 你这个“加载DLL的进程”(无论你是用VB6程序来调用,还是在VBA代码中调用),   与“创建的Excel对象的进程”,并不是“同一个进程空间”的,因此没有效果。 你在楼上说的“因为VB的DLL都是ActiveX的DLL”,这个也不对啊…… VB6“原生环境”确实是只支持 ActiveX DLL ; 不过,我早就发布了一个工具,可以让VB6编译 Standard Call的DLL了。 对于64位的Excel,我没试过。 不过对于32位的Excel,我觉得完全可以“封装”到DLL中, 通过“利用VBA的VBE对象,动态添加代码,调用‘破解’接口”的方法来处理。 [/quote] 对于第一点:我也这么认为:不是全局的,他们的内存空间不一样,所以才会求助在DLL的内存空间中修改oXL的内存空间。 对于第二点:之前给高手你发过私信,我这边一旦调用“标准”DLL,Excel就死机。所以我就用微软自己的方法,给exe和dll都写一个manifest,这样就可以不用注册,直接使用了。即使没有管理员权限,也可以使用。 所以现在的困难点就是不知道怎样通过dll的内存空间,修改通过它创建的excel对象的内存空间。
舉杯邀明月 2018-03-13
  • 打赏
  • 举报
回复
这个“解锁”只是HOOK了一个API,跟“对象”无关啊。 不明白你封装这段代码,为何要在“dll里面创建了一个excel的对象”?
加载更多回复(2)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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