标签: com

RegSvr32退出代码文档?

我玩了RegSvr32.exe注册COM服务器并获得下一个退出代码:

0 - 正确注册正常的DLL Com Server时

3 - 尝试注册假DLL Com Server时(简单文本文件重命名为.DLL

4 - 尝试注册简单的DLL时,而不是Com Server

问题:我可以在哪里找到所有可能的退出代码及其含义的官方(或非官方但好的)描述?

在互联网上搜索没有给我结果,所以我发现这个主题在哪里写的退出代码与Windows系统错误代码相同,但我不明白为什么然后当尝试注册坏文件我得到代码= 3= ERROR_PATH_NOT_FOUND,并在注册非COM DLL时 - 4= ERROR_TOO_MANY_OPEN_FILES?对我来说,这听起来并不合乎逻辑.

windows com dll winapi regsvr32

27
推荐指数
3
解决办法
2万
查看次数

有没有办法解码pywin32中的数字COM错误代码

这是最近运行的一个用Python编写的不可靠应用程序的堆栈跟踪的一部分,该应用程序控制用Excel编写的另一个应用程序:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146788248), None)
Run Code Online (Sandbox Code Playgroud)

显然出现了问题...但是什么?[1]这些COM错误代码似乎过于神秘.

如何解码此错误消息?是否有一个表允许我将这个数字错误代码转换为更有意义的东西?

[1]我实际上知道在这种情况下出了什么问题,它试图访问一个没有Name属性的Range对象上的Name属性...并不是所有的bug都很容易找到!

python windows com excel pywin32

26
推荐指数
4
解决办法
2万
查看次数

如何获取COM对象的类型

我在Visual Studio中引用了一个COM库,因此它为我自动创建了相应的Interop程序集.我想GetType()对这些com对象做一个,但它们总是返回System.__ComObject.查询它们的接口有效:

bool isOfType = someComeObject is ISomeComObject; //this works
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是返回com对象的实际类型:

Type type = someComeObject.GetType(); //returns System.__ComObject :-(
Run Code Online (Sandbox Code Playgroud)

有谁知道怎么做我想做的事情?

.net com reflection interop com-interop

26
推荐指数
2
解决办法
1万
查看次数

如何从PowerShell调用复杂的COM方法?

是否可以使用命名参数从PowerShell调用COM方法?我正在使用的COM对象方法有许多参数:

object.GridData( DataFile, xCol, yCol, zCol, ExclusionFilter, DupMethod, xDupTol,
    yDupTol, NumCols, NumRows, xMin, xMax, yMin, yMax, Algorithm, ShowReport,
    SearchEnable, SearchNumSectors, SearchRad1, SearchRad2, SearchAngle, 
    SearchMinData, SearchDataPerSect, SearchMaxEmpty, FaultFileName, BreakFileName, 
    AnisotropyRatio, AnisotropyAngle,  IDPower, IDSmoothing, KrigType, KrigDriftType, 
    KrigStdDevGrid, KrigVariogram, MCMaxResidual, MCMaxIterations, MCInternalTension, 
    MCBoundaryTension, MCRelaxationFactor, ShepSmoothFactor, ShepQuadraticNeighbors, 
    ShepWeightingNeighbors, ShepRange1, ShepRange2, RegrMaxXOrder, RegrMaxYOrder, 
    RegrMaxTotalOrder, RBBasisType, RBRSquared, OutGrid,  OutFmt, SearchMaxData, 
    KrigStdDevFormat, DataMetric, LocalPolyOrder, LocalPolyPower, TriangleFileName )
Run Code Online (Sandbox Code Playgroud)

这些参数中的大多数是可选的,其中一些是互斥的.在使用win32com模块的Visual Basic或Python中,您可以使用命名参数来仅指定所需选项的子集.例如(在Python中):

Surfer.GridData(DataFile=InFile,
                xCol=Options.xCol,
                yCol=Options.yCol,
                zCol=Options.zCol,
                DupMethod=win32com.client.constants.srfDupMedZ,
                xDupTol=Options.GridSpacing,
                yDupTol=Options.GridSpacing,
                NumCols=NumCols,
                NumRows=NumRows,
                xMin=xMin,
                xMax=xMax,
                yMin=yMin,
                yMax=yMax,
                Algorithm=win32com.client.constants.srfMovingAverage,
                ShowReport=False,
                SearchEnable=True,
                SearchRad1=Options.SearchRadius,
                SearchRad2=Options.SearchRadius, …
Run Code Online (Sandbox Code Playgroud)

com powershell

26
推荐指数
1
解决办法
7033
查看次数

在C#/ .Net中创建进程外COM?

我需要在C#中创建一个进程外COM服务器(.exe),它将被同一个盒子上的多个其他进程访问.组件必须是单个进程,因为它会将其提供的信息缓存到内存中的使用者.

注意:访问我的COM服务器的进程主要是Matlab进程,因此需要 COM接口.

我已经看到了关于在.Net上创建进程内COM组件的线程溢出(创建COM ...)和Web上的线程,但我很难找到一种方法来创建.Net的进程外组件.

这怎么可以实现?任何建议的参考?

谢谢.

c# com

25
推荐指数
5
解决办法
3万
查看次数

基于Windows Server 2008 x64的Excel 2007自动化

我很清楚微软的支持基础文章说它不支持自动化办公产品UI.似乎Windows Server 2008 x64和Excel 2007强制执行给定的语句.

我在NT服务(本地系统帐户)OnStart方法中运行以下代码.当它在控制台应用程序中运行相同的代码时,它所做的只是Excel自动化.

提供的代码有两部分.第一部分启动Excel,创建一个新的工作簿并将其保存到给定的文件名.第二部分启动Excel的新实例并打开给定文件.打开操作以此异常结束:

服务无法启动.System.Runtime.InteropServices.COMException(0x800A03EC):Microsoft Office Excel无法访问文件'c:\ temp\test.xls'.有几个可能的原因:

•文件名或路径不存在.•该文件正由另一个程序使用.?您尝试保存的工作簿与当前打开的工作簿具有相同的名称.

为什么自动excel能够启动并将文件写入磁盘但是当它被要求"只是"打开现有文件时失败?

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
// launch excel and create/save a new work book
Microsoft.Office.Interop.Excel.ApplicationClass excel = new       Microsoft.Office.Interop.Excel.ApplicationClass();
excel.UserLibraryPath, excel.Interactive));
//            
string filename = "c:\\temp\\test.xls";
if(System.IO.File.Exists(filename)) System.IO.File.Delete(filename);
//
excel.Workbooks.Add(System.Reflection.Missing.Value);
excel.Save(filename);
excel.Quit();
excel = null;
// lauch new instance of excel and open saved file
excel = new Microsoft.Office.Interop.Excel.ApplicationClass();
try
{
    Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open(filename,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                true,
                System.Reflection.Missing.Value,
                System.Reflection.Missing.Value,
                false,
                false,
                System.Reflection.Missing.Value, …
Run Code Online (Sandbox Code Playgroud)

com excel-2007 office-automation

25
推荐指数
2
解决办法
2万
查看次数

捕获COMException特定的错误代码

我希望有人可以帮助我.我有一个COM需要捕获的特定异常,然后尝试做其他事情,其他所有都应该被忽略.我的错误消息是异常:

System.Runtime.InteropServices.COMException(0x800A03EC):Microsoft Office Excel无法访问文件"C:\ test.xls".有几个可能的原因:

所以我最初的尝试是

try
{
 // something
}
catch (COMException ce)
{
   if (ce.ErrorCode == 0x800A03EC)
   {
      // try something else 
   }
}
Run Code Online (Sandbox Code Playgroud)

然而,我读了一个编译器警告:

警告22与积分常数的比较是无用的; 常量超出了'int'类型的范围..... ExcelReader.cs 629 21

现在我知道0x800A03EC是HResult,我刚看了MSDN并阅读:

HRESULT是一个32位值,分为三个不同的字段:严重性代码,设施代码和错误代码.严重性代码指示返回值是表示信息,警告还是错误.设施代码标识负责该错误的系统区域.

所以我的最终问题是,我如何确保捕获该特定异常?或者我如何从HResult获取错误代码?

提前致谢.

c# com

25
推荐指数
2
解决办法
3万
查看次数

如何防止Windows缓存Com Class信息?

Windows 7正在缓存一些COM类信息.较旧的操作系统没有这样做.操作系统查找该HKCU\Software\Classes\CLSID\{GUID}\LocalServer32值后,它会缓存该值,并且不再查找该值.

当我们更新软件时,我们将新更新放在不同的目录中,然后更新该HKCU\Software\Classes\CLSID\{GUID}\LocalServer32值以反映新路径.下次运行软件时,如果在较旧的Windows操作系统下运行,它将使用最新文件.但是,在Windows 7上,它将继续使用旧文件,直到重新启动操作系统.

我运行了进程监视器,发现在Windows 7下,它在第一次读取后再也没有再次读取注册表项.在较旧的操作系统上,它每次都会读取该密钥.

我的问题是:每次创建一个新的proc COM对象时,有没有办法强制Windows 7重新读取HKCU配置单元中的LocalServer32信息?

windows com registry caching windows-7

25
推荐指数
1
解决办法
766
查看次数

我的$ Foo ATL解决方案中的($ Foo)PS项目是什么?

在MSVC中创建一个ATL项目似乎创建了一个而不是两个项目; 后者的名称与前者相同,但附加了PS名称.第二个项目的目的是什么?如何判断我是否需要它?

c++ com atl visual-studio

25
推荐指数
3
解决办法
3311
查看次数

将.NET事件暴露给COM?

我一直在尝试向VBA客户端公开和触发事件.到目前为止,在VBA客户端,事件已暴露,我看到方法事件处理方法已添加到我的模块类,但VBA事件处理方法不会触发.出于某种原因,调试事件时为null.同步修改我的代码也没有帮助.

为了记录,我已经检查了其他SO问题,但他们没有帮助.

任何好的答案将不胜感激.

[ComVisible(true)]
[Guid("56C41646-10CB-4188-979D-23F70E0FFDF5")]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IWebEvents))]
[ProgId("MyAssembly.MyClass")]
public class MyClass : ServicedComponent, IMyClass
{
    public string _address { get; private set; }
    public string _filename { get; private set; }

    [DispId(4)]
    public void DownloadFileAsync(string address, string filename)
    {
        _address = address;
        _filename = filename;
        System.Net.WebClient wc = new System.Net.WebClient();
        Task.Factory.StartNew(() => wc.DownloadFile(_address, _filename))
            .ContinueWith((t) =>
        {
            if (null != this.OnDownloadCompleted)
                OnDownloadCompleted();
        });
    }
    public event OnDownloadCompletedEventHandler OnDownloadCompleted;
}

[ComVisible(false)]
public delegate void OnDownloadCompletedEventHandler();

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IWebEvents
{ …
Run Code Online (Sandbox Code Playgroud)

c# com events vba

25
推荐指数
1
解决办法
3821
查看次数