无法创建名称为“”的对象 COM
The object with the name "" could not be created COM
我得到了以下 COM 对象
namespace PCKTicketCOM
{
[Guid("0057ddf4-7125-485b-b963-5d2b338040bc"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IPCKTicketCOM
{
[DispId(1)]
int AddTheseUp(int adder1, int adder2);
}
[Guid("3c63584c-f51a-4ce8-8f24-734686895cba"),
ClassInterface(ClassInterfaceType.None)]
public class PCKTicketCOM : IPCKTicketCOM
{
// a method that returns an int
public int AddTheseUp(int adder1, int adder2)
{
return adder1 + adder2;
}
}
}
并尝试通过 VBS 调用它,但我总是收到错误
The object with the name "PCKTicketCom.PCKTicketCOM" could not be created
而且我对如何解决这个问题一无所知。
dim objTest, intResult
Set objTest = WScript.CreateObject("PCKTicketCOM.PCKTicketCOM")
intResult = objTest.AddTheseUp(100,200)
WScript.echo "Result = " & intResult
我似乎也无法使用 google 找到有关此问题的任何信息,我们将不胜感激。
您可以使用SysInternals 的Process Monitor 来观察注册表的使用方式。 Regasm.exe 和 VBS 脚本引擎(通常 cscript.exe)。这样你会很容易看到不匹配。
如今 非常 常见的原因是您没有意识到 VBS 脚本引擎 运行 在 64 位操作系统上处于 64 位模式系统。除非你明确 运行 c:\windows\syswow64\cscript.exe 所以你得到 32 位版本。
64 位程序在 HKLM\Software\Classes\CLSID 中查找,32 位程序在 HKLM\Software\Wow6432Node\Classes\CLSID 中查找。请注意添加的 Wow6432Node。 Appcompat 功能可确保程序在意外加载位数错误的可执行文件时不会崩溃。
如果您让 Visual Studio 使用项目的“构建”选项卡中的 "Register for COM interop" 选项注册服务器,则只会写入 32 位 Wow6432Node 注册表项。 VS 是 32 位进程的一个相当不可避免的副作用。如果您自己使用 Regasm.exe 注册,请确保选择正确的。将写入 64 位密钥的 64 位版本位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319,注意 "Framework64".
我得到了以下 COM 对象
namespace PCKTicketCOM
{
[Guid("0057ddf4-7125-485b-b963-5d2b338040bc"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IPCKTicketCOM
{
[DispId(1)]
int AddTheseUp(int adder1, int adder2);
}
[Guid("3c63584c-f51a-4ce8-8f24-734686895cba"),
ClassInterface(ClassInterfaceType.None)]
public class PCKTicketCOM : IPCKTicketCOM
{
// a method that returns an int
public int AddTheseUp(int adder1, int adder2)
{
return adder1 + adder2;
}
}
}
并尝试通过 VBS 调用它,但我总是收到错误
The object with the name "PCKTicketCom.PCKTicketCOM" could not be created
而且我对如何解决这个问题一无所知。
dim objTest, intResult
Set objTest = WScript.CreateObject("PCKTicketCOM.PCKTicketCOM")
intResult = objTest.AddTheseUp(100,200)
WScript.echo "Result = " & intResult
我似乎也无法使用 google 找到有关此问题的任何信息,我们将不胜感激。
您可以使用SysInternals 的Process Monitor 来观察注册表的使用方式。 Regasm.exe 和 VBS 脚本引擎(通常 cscript.exe)。这样你会很容易看到不匹配。
如今 非常 常见的原因是您没有意识到 VBS 脚本引擎 运行 在 64 位操作系统上处于 64 位模式系统。除非你明确 运行 c:\windows\syswow64\cscript.exe 所以你得到 32 位版本。
64 位程序在 HKLM\Software\Classes\CLSID 中查找,32 位程序在 HKLM\Software\Wow6432Node\Classes\CLSID 中查找。请注意添加的 Wow6432Node。 Appcompat 功能可确保程序在意外加载位数错误的可执行文件时不会崩溃。
如果您让 Visual Studio 使用项目的“构建”选项卡中的 "Register for COM interop" 选项注册服务器,则只会写入 32 位 Wow6432Node 注册表项。 VS 是 32 位进程的一个相当不可避免的副作用。如果您自己使用 Regasm.exe 注册,请确保选择正确的。将写入 64 位密钥的 64 位版本位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319,注意 "Framework64".