我有一个x64服务器,因为我的库编译为AnyCPU,在x64下运行.我们需要访问在x86下注册的COM组件.我不太了解COM,我的谷歌搜索让我无处可去.
问题:对于COM组件,我可以使用从x64到x86的符号注册表链接吗?我是否还需要在x64下注册COM组件?我可以(这里的任何陈述......)?
谢谢.
我的项目(某种处理引擎)分为2个dll:一个具有接口声明,一个具有功能.通常,项目由外部Delphi项目通过COM技术使用.
让我们说我的程序切片水果.外部delphi程序创建Fruit对象并填充其属性:weight(int),Name(字符串)和ProgressUpdater(类型为IProgressUpdater,在第二个dll中使用接口声明).在此exst programm creater Slicer之后,生成Slicer.AddFruit(newFruit)并调用Slicer.Slice().
没什么特别的.在现实生活中,delphi项目是Outlook插件.但问题是这样 - 有时一些VSTO插件使Outlook工作在"影子复制文件"模式,所以当delphi项目启动并创建Slicer对象时,我们的c#程序集将被放入临时文件夹,并将使用此本地路径创建程序集.嗯......这仍然不是问题.但问题是当delphi项目创建newFruit然后传递ProgressUpdater对象时,在我的Slicer程序集中我无法获得外部ProgressUpdater:"返回参数具有无效类型",但仍然可以获得具有简单类型(权重,名称)的字段.
它仅在启用shadowCopyFiles模式时发生.所以我的猜测是 - 外部ProgressUpdater的装配和切片器装配放置在不同的地方,因此它们无法通过.我的问题是如何避免我的dll被"影子复制"?还是有一些不同的解决方案?
我努力搜索,却无法掌握整个想法.谁能告诉我:
或者至少,请指出一篇解释这些概念的好文章?谢谢!
我刚刚开始通过C#调整Excel,以便能够自动创建,并添加到Excel文件中.
我可以打开文件并更新其数据并浏览现有的工作表.我的问题是如何添加新表?
我试过了:
Excel.Worksheet newWorksheet;
newWorksheet = (Excel.Worksheet)excelApp.ThisWorkbook.Worksheets.Add(
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Run Code Online (Sandbox Code Playgroud)
但我得到COM异常,我的谷歌搜索没有给我任何答案.
来自HRESULT的异常:0x800A03EC来源是:"Interop.Excel"
我希望有人能够让我摆脱困境.
我正在构建一个C#ActiveX DLL ...我使用REGASM或REGSVR32进行注册吗?
如何注册64位接口和32位接口?
我必须创建一个自动化Outlook和Word的应用程序,我想使用Java来完成该任务.(唯一允许的替代方案是VB6,所以...)
经过Google快速调查后,我找到了几个库,但我不确定使用哪个库:
我不知道如何比较这些库并做出明智的决定.似乎COM4J有点过时,JACOB泄漏内存(据称)和jacoZoom是商业版.每个人似乎都需要很多样板代码才能执行简单的方法调用.(考虑到COM的设计,这可能是不可避免的)
除此之外,我不知道如何在其中一个之间做出选择.哪一个是最好的?
我试图找到我的程序中的瓶颈(目前处于"低悬的水果"阶段),并使用分析器我得到如下内容:

我在这里看到的是RtlInitializeExceptionChain占用了大部分时间,而我实际程序中的函数甚至没有进入这个顶级列表.我想知道是否有人知道RtlInitializeExceptionChain做了什么,如何调用它,以及如何重新组织我的程序而不是这么称呼它?
关于我的项目的一些其他信息:它是使用ATL的COM API,被分析的程序是一个"测试"C++程序,它使用这个API.
谢谢!
可能在全球每秒都会产生数千个新的GUID.其中一些可能只在一秒钟内使用,然后永远陷入遗忘.其他人可能更幸运,持续时间更长,但仅限于单个数据库或计算机系统,并且不具有普遍意义.
并且只有一小部分GUID是精英,天生具有全球知名度并且可能永远存在.有时它们被称为众所周知的 GUID.当然,这个概念是不精确的,有点主观.有时,了解某个知名的GUID可以为您提供权力或打开大门来访问某些API.
一个例子是Windows ED7BA470-8E54-465E-825C-99712043E01C中的所谓"上帝模式"GUID .
另一个是DF8395B5-A4BA-450b-A77C-A9A47762C520,仅在Web上的几个页面上提及,但如果您想从托管代码调用某些CLR调试或分析API,则非常有用.
其中一些(如53D29EF7-377C-4D14-864B-EB3A85769359)是系统设备的标识符,在搜索丢失的驱动程序时可能很有用.
我很想知道是否有已发布的列表,或者某些社区支持的数据库,包括一些(希望是大多数)众所周知的GUID及其描述,种类(例如COM CLSID,系统设备ID,......),发布者,过时/弃用状态以及其他相关信息?
就个人而言,我有一个大约一百个GUID的列表,这些GUID在几个场合被证明是非常有用的.我还发现短名单像这样针对特定狭窄区域.
当使用COM时,布尔值将作为VARIANT_BOOL传递,该变量在wtypes.h中声明为short.还有预定义的true和false值:
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
Run Code Online (Sandbox Code Playgroud)
哪个是从VARIANT_BOOL转换为C++ bool类型的最佳方法?明显的变体是:
与VARIANT_FALSE比较
简单地投奔布尔
其他方式可以很容易地发明.
这是最好的方法 - 最可读,最符合标准,最不容易出现种植错误,最不容易出现移植到64位平台的问题?
我正在扩展我的Inno-Setup脚本,其中包含我最好在托管DLL中的C#中实现的代码.我已经知道如何从托管DLL导出方法作为在非托管进程中使用的函数.它可以通过IL编织来完成,并且有一些工具可以实现自动化:
因此,在导出后,我可以在Inno-Setup安装程序中从Pascal脚本调用我的函数.但是有一个问题:DLL似乎不再被卸载了.使用Inno-Setup UnloadDLL(...)无效,文件将保持锁定状态,直到安装程序退出.因此,安装程序等待2秒,然后无法从临时目录(或安装目录)中删除我的DLL文件.事实上,它确实存在,直到有人清理驱动器.
我知道无法再从AppDomain卸载托管程序集,除非整个AppDomain关闭(进程退出).但是对于非托管主机进程意味着什么呢?
是否有更好的方法允许Inno-Setup在加载和使用后卸载或删除我的DLL文件?