我试图从VB.NET编辑word文档,大部分使用此代码:
如何从Visual Basic .NET自动化Word以创建新文档 http://support.microsoft.com/kb/316383
它在我的机器上工作正常,但当我发布到服务器时,我得到以下错误.
由于以下错误,检索具有CLSID {000209FF-0000-0000-C000-000000000046}的组件的COM类工厂失败:80070005.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息: System.UnauthorizedAccessException:由于以下错误,检索具有CLSID {000209FF-0000-0000-C000-000000000046}的组件的COM类工厂失败:80070005.
当我尝试创建一个单词应用程序对象时,会发生实际错误
Dim oWord As New Word.Application
Run Code Online (Sandbox Code Playgroud)
使用Visual Studio 2008和VB.NET 3.5.我引用了"Microsoft Word 10.0对象库",我在bin目录中看到了Interop.Word.dll文件.
在开发计算机和Windows Server 2003上使用MS Office 2003
对.NET来说仍然相当新,并且对窗口服务器知之甚少,但"UnauthorizedAccessException"听起来像是一个权限问题.我想知道是否有人可以指出我正确的方向,我可能需要做什么来让我的小应用程序访问使用word.
在我工作的一些IDL中,我注意到在方法中有两种用于标记返回值的约定 - [in, out]和[out, retval].
似乎[in, out]在有多个返回值时使用,例如:
HRESULT MyMethod(
[in] long InputParam,
[in, out] long* OutputParam1,
[in, out] long* OutputParam2
);
Run Code Online (Sandbox Code Playgroud)
似乎[out, retval]只有一个返回值时使用,例如:
HRESULT MyMethod2(
[in] long InputParam,
[out, retval] long* OutputParam1
);
Run Code Online (Sandbox Code Playgroud)
这是一个COM IDL约定还是我正在使用的代码中的约定?
从2个符号生成的代码是否存在功能差异,或者它们是否完全可互换?
我是编程/ python的新手,所以我很感激我能得到的任何帮助.我想通过COM使用Excel将excel文件保存为特定格式.这是代码:
import win32com.client as win32
def excel():
app = 'Excel'
x1 = win32.gencache.EnsureDispatch('%s.Application' % app)
ss = x1.Workbooks.Add()
sh = ss.ActiveSheet
x1.Visible = True
sh.Cells(1,1).Value = 'test write'
ss.SaveAs(Filename="temp.xls", FileFormat=56)
x1.Application.Quit()
if __name__=='__main__':
excel()
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我没有明确知道它的代码,我该如何指定FileFormat?浏览文档,我找到了关于FileFormat对象的参考.我对如何访问XlFileFormat对象并以一种我可以找到它的枚举值的方式导入它一无所知.
谢谢!
我想在UNIX类型平台上用C++实现COM的自定义实现,以允许我动态加载和链接面向对象的代码.我认为这将基于POSIX提供的类似功能集来加载和调用dll,即dlopen,dlsym和dlclose.
据我所知,COM的一般思想是你链接到一些函数,即QueryInterface,AddRef和Release in a common dll(Kernel32.dll),然后允许你访问接口,这些接口只是一个用指针封装的函数指针表应该调用函数指针的对象.这些函数通过IUnknown公开,你必须继承它.
那一切都有用吗?有没有更好的方法来动态链接和加载到面向对象的代码?如何从dll继承工作 - 对基类的每次调用都必须是暴露的成员函数,即private/protected/public是否被忽略?
我非常精通C++和模板元编程,并且已经拥有一个完全反映的C++系统,即成员属性,成员函数和使用boost的全局/静态函数.
我以前有一个过时但有价值的解决方案来显示我系统上注册的所有这些库的COM/ActiveX控件和类型库内容(ProgID,方法名称和签名,枚举,常量,接口/ coclass等).
它提供了类似资源管理器的概述,可用于ActiveX开发/脚本编写的所有内容,并作为自动API文档工具提供,因为大多数COM/ActiveX库的官方文档要么完全缺失,要么最不完整.
由于内部依赖于64位Windows上不再支持的32位VB6运行时(comctl32.ocx),我最近转向64位Windows渲染了我无法使用的程序.
有谁知道仍然有效的替代方案?
我正在考虑使用#@字符!在我们的系统生成的一些COM接口中.COM类型库也导出到.NET.这些角色会在以后给我带来麻烦吗?
我今天大部分时间都测试了它,一切看起来都很好.我们的系统继续像往常一样工作.
我谨慎的原因是这些字符在MIDL中是非法的,它使用C语法作为类型名称.但我们不使用MIDL - 我们使用ICreateTypeInfo和ICreateTypeLib构建我们的类型库.看起来这只是一个MIDL限制,COM和.NET对非字母数字字符很满意.但也许有一些我不知道的东西......
我想将类型库(tlb)导入C#.
如何.tlb将.cs代码导入代码文件?
Borland Delphi可以使用命令行工具导入.tlb到:.pastlibimp.exe
C:\Develop>tlibimp.exe SopQuotingEngineActiveX.tlb
Borland TLIBIMP Version 5.1 Copyright (c) 1997, 2000 Inprise Corporation
Type library loaded...
Created C:\Develop\SopQuotingEngineActiveX_TLB.dcr
Created C:\Develop\SopQuotingEngineActiveX_TLB.pas
Run Code Online (Sandbox Code Playgroud)
现在有一个.pas源代码文件,包含常量,枚举,接口,它们位于已编译的Type Library(tlb)文件中:
SopQuotingEngineActiveX_TLB.pas:
unit SopQuotingEngineActiveX_TLB;
interface
...
const
CLASS_XSopQuotingEngine: TGUID = '{3A46FFB8-8092-4920-AEE4-0A1AAACF81A0}';
...
// *********************************************************************//
// Interface: IXSopQuotingEngine
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {AA3B73CC-8ED6-4261-AB68-E6AE154D7D52}
// *********************************************************************//
IXSopQuotingEngine = interface(IDispatch)
['{AA3B73CC-8ED6-4261-AB68-E6AE154D7D52}']
procedure OnStartPage(const AScriptingContext: IUnknown); safecall;
procedure OnEndPage; safecall;
procedure Connect(const ConnectionString: WideString); safecall; …Run Code Online (Sandbox Code Playgroud) 假设我有一个C#Nullable DateTime?属性需要由VBA通过COM使用.
public DateTime? TestDate {
get ; set;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,通过COM看不到Nullables,所以我希望该属性返回一个可以被视为VBA Variant的东西.
不幸的是,我不确定应该怎么写.
我尝试使用a object和a dynamic而不是DateTime?:虽然我可以获取属性值,但我无法设置它(我从VBA 获得运行时错误'424'对象所需的错误).
注意:我没有让我的库COM可见的问题:一切正常,我可以毫无问题地使用VBA中的.Net类型,除了这个特殊问题.
谢谢你的任何指示.
编辑:我发现了一个有趣的页面,描述了对象的默认编组,但我似乎无法解释为什么我声明为无法设置我的属性object.
我错过了什么.
我想在我的.Net4.0 dll中加载一个.NET 2.0 dll.我确实搜索了解决方案并找到了'useLegacyV2RuntimeActivationPolicy'属性,我可以将其添加到我的app.config中,如此URL:混合模式程序集是针对版本'v1.1.4322'构建的
但问题是,在我的情况下,我试图在我的4.0 DLL中使用.net2.0 dll,而不是在4.0 exe中.原因是这个4.0 dll然后在Excel中用作自动化插件.
目前,当我从Excel处理我的.NET 4.0 API(为一个功能加载2.0 dll)时,我得到'混合模式2.0 dll无法在4.0运行时加载',这是可以理解的,因为COM加载了4.0 CLR,因此无法加载2.0 dll.
不知何故,我需要使我的4.0 DLL加载2.0运行时.我尝试将app.config添加到4.0 dll但我猜只有.exe默认读取app.config才能加载clr.这是我在4.0 dll项目中的app.config中所拥有的,但没有用.
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
如何解决此问题以使我的.NET 4.0 DLL能够使用.NET 2.0 DLL?
谢谢,玛尼
我以为我知道怎么做,但显然不是这样,我会感激一些帮助!我无法让我的dll注册,所以我可以在VBS或其他地方实例化它.
我编写了以下示例类,选中"Make assembly COM Visible",选中"Register for COM Interop",然后构建它.当我尝试从VBS实例化它时,我得到"Activex组件无法创建对象"错误.
这是类代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Smurf
{
public class Pants
{
public string Explode(bool Loud)
{
string result;
if (Loud)
result = "BANG";
else
result = "pop";
return result;
}
}
}
Run Code Online (Sandbox Code Playgroud)
......这是VBS:
Dim a
Set a = CreateObject("Smurf.Pants")
msgbox("ok")
Run Code Online (Sandbox Code Playgroud)
我还需要做什么?
谢谢 :)
[编辑]
忘了提,在第一次失败后我尝试了REGSVR32和REGASM - 没有帮助!
[/编辑]
请注意,当我尝试REGSVR32时,我收到以下消息:
模块"C:...\Smurf.dll"已加载,但未找到入口点DllRegisterServer.确保"C:...\Smurf.dll"是有效的DLL或OCX文件,然后重试.
这有多大帮助?
这是代码的最新版本:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace Smurf
{
[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
public …Run Code Online (Sandbox Code Playgroud)