VBA CreateObject无法在64位Windows

时间:2017-08-23 08:14:08

标签: vba dll com activex 32bit-64bit

我必须在Visual Studio 2013中编写程序,但它不起作用,所以我开始使用Microsoft Excel及其开发游乐场测试所有可能性。我开始使用以下版本(由提供我需要使用的程序的公司提供):

Sub Main()

    Dim XServer As X2000.Server
    Dim XApp As X2000.Application
    Dim XSR As X2000.ScriptRoutines

    Set XServer = New X2000.Server
    Set XApp = XServer.AppConnection()    '<- This actually fires the application
    XApp.Visible = True

    Set XSR = XApp.ScriptCommands
    XSR.DATA_FILENAME = "C:\X2000\myFile.x"    ' <- Code blocks here

End Sub

这基本上启动应用程序X2000.exe,将我的代码连接到它,然后通过在程序中加载DATA_FILENAME来执行myFile.x赋值例程。我需要启动该应用程序,因为此时它的许可证已经过检查,我没有其他选择可以使用。

现在,在这个版本中,代码在最后一行阻塞了&#34;缺少一个dll&#34;没有任何其他信息。我通过执行以下操作尝试对ScriptRoutines对象进行后期绑定:

Dim XServer As X2000.Server
Dim XApp As X2000.Application
Dim XSR As Object

Set XServer = New X2000.Server
Set XApp = XServer.AppConnection()
XApp.Visible = True

XSR = CreateObject("XApp.ScriptCommands")

这也不起作用,但确实给了我一些信息:&#34; ActiveX控件无法加载对象&#34;。我做了一些研究,并通过&#34; Dependancy Walker&#34;发现,X2000.exe取决于MSVBVM60.DLLsystem32文件夹中缺少system32。好奇,因为我的系统是64位,Excel也是,我在VS2013上使用32位兼容性尝试了代码,但代码仍无法正常工作。
我安装了the service pack from Microsoft,其中包含此文件,但发现sysWoW64未被触及... MSVBVM60.DLL代之以X2000.exe,因此我怀疑function [Data,eng_or_met] = Read_X2000_File_BB_2(sFileName) XServer = actxserver('X2000.server'); XApp = XServer.AppConnection; XApp.Visible = 1; objX2000 = XApp.ScriptCommands; objX2000.data_filename = "C:\X2000\myFile.x"; delete(XServer); 只是为了与32位系统一起工作:我错了。

我的一位同事可以执行用MATLAB代码编写的相同程序:

Dim XSR As Object
Set XSR = CreateObjectx86("XApp.ScriptCommands") ' create ActiveX via x86 mshta host

此代码的工作归功于actxserver function,我相信它可以解决此兼容性问题。

如何使用Excel / VS2013执行相同的操作?

修改

我尝试使用omegastripes建议的代码:

CreateObjectx86

If / Else函数linked here。我尝试了两个Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID) 条件,最后无论如何都没有创建对象,包括:

Set CreateObjectx86 = CreateObject(sProgID)

#If Win64

如果我不更改代码(因此不是Dim XServer As Object Dim XApp As X2000.Application Dim XSR As X2000.Script Set XServer = CreateObject("X2000.Server") Set XApp = XServer.AppConnection() XApp.Visible = True Set XSR = X2000.ScriptCommands ),最后一行就会被执行。

修改

根据这个问题的第一个答案,我也尝试过:

<add name="sometablecontext" connectionString="Server=tcp:someservername.database.windows.net,1433;Initial Catalog=databasename;Persist Security Info=False;User ID=username;Password=password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30" providerName="System.Data.SqlClient"/>

只是发现我得到了同样的错误。

1 个答案:

答案 0 :(得分:1)

我显然已经解决了这个问题。受Hans Passant的启发,DimXServer作为唯一对象,具体取决于对X2000.exe的引用:

Dim XServer As X2000.Server
Dim XApp As Object
Dim XSR As Object

Set XServer = New X2000.Server
Set XApp = XServer.AppConnection
XApp.Visible = True
Set XSR = XApp.ScriptCommands

XSR.DATA_FILENAME = "C:\foo.x" 

DATA_FILENAME实际上是一个被执行的“ScriptCommand”。

这很简单。但我不知道为什么会这样。