我玩了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?对我来说,这听起来并不合乎逻辑.
这是最近运行的一个用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都很容易找到!
我在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)
有谁知道怎么做我想做的事情?
是否可以使用命名参数从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) 我需要在C#中创建一个进程外COM服务器(.exe),它将被同一个盒子上的多个其他进程访问.组件必须是单个进程,因为它会将其提供的信息缓存到内存中的使用者.
注意:访问我的COM服务器的进程主要是Matlab进程,因此需要 COM接口.
我已经看到了关于在.Net上创建进程内COM组件的线程溢出(创建COM ...)和Web上的线程,但我很难找到一种方法来创建.Net的进程外组件.
这怎么可以实现?任何建议的参考?
谢谢.
我很清楚微软的支持基础文章说它不支持自动化办公产品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需要捕获的特定异常,然后尝试做其他事情,其他所有都应该被忽略.我的错误消息是异常:
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获取错误代码?
提前致谢.
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信息?
在MSVC中创建一个ATL项目似乎创建了一个而不是两个项目; 后者的名称与前者相同,但附加了PS名称.第二个项目的目的是什么?如何判断我是否需要它?
我一直在尝试向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)