标签: com

Delphi和COM:TLB和维护问题

在我工作的公司中,我们使用C#开发所有GUI,但应用程序内核主要是在Delphi 5中开发的(由于历史原因),在COM +中使用了很多组件.与这个非常具体的应用相关,我有两个问题:

  • Delphi和/或COM中经验丰富的人,您是否有任何工作场所可以使用错误的TLB接口?一些错误是:IDE在大型TLB的编辑过程中崩溃,丢失方法ID,TLB损坏等.在这里,我们还没有找到任何好的解决方案.实际上我们尝试升级做新的2007版本.但是新的IDE TLB接口具有我们之前发现的相同错误.

  • 你如何控制TLB版本?TLB文件采用二进制格式,冲突解决方案很难做到.我们尝试将接口描述导出到IDL并提交到CVS,但我们没有找到任何使用Delphi从IDL生成TLB的好方法.另外,Microsoft提供的MIDL工具没有正确解析我们从delphi导出的IDL文件.

delphi com typelib com-hell

9
推荐指数
3
解决办法
5402
查看次数

C#清理C++分配的内存吗?

我有一个带有以下签名的假设COM对象

void MemAlloc(ref double[] test, int membercount)
Run Code Online (Sandbox Code Playgroud)

使用new/malloc在C++中分配内存的地方.一旦这是在C#中,使用RCW,我如何确保正确释放内存?我认为.NET很难释放,考虑到在C++中你需要知道它是否已经分配了new/malloc/mm_malloc才能正确释放它.那么,清理我的C++分配数组的合适方法是什么?谢谢.

c# c++ com interop

9
推荐指数
2
解决办法
5728
查看次数

在C#中实现OPOS设备

对于一些传统POS应用程序的互操作,我想知道是否有可能在C#中实现虚假的OPOS设备.

基本上我会实现一个虚假键盘,它接受Web请求并将按键传递给遗留应用程序.

有谁知道这是可能的还是在哪里获得文件?我认为OPOS刚刚调用了由注册表项配置的COM对象.所有这些都应该在C#中实现.

c# com opos

9
推荐指数
1
解决办法
9985
查看次数

什么是COM技术的当前模拟?

COM技术似乎已经过时了,但仍在使用中.但是,在构建.NET应用程序时,特别是在WPF中,建议采用什么方法来实现相同类型的互操作性?

即什么是COM对象的现代替代品?

.net c# com wpf

9
推荐指数
3
解决办法
360
查看次数

如何在ActiveX方法调用期间防止WPF事件处理程序的重入?

我们在WPF和STA应用程序中调用ActiveX组件上的方法.此调用是通过以下方式执行的:

res = ocx.GetType().InvokeMember(methodName, flags, null, ocx, args);
Run Code Online (Sandbox Code Playgroud)

...其中ocx是使用System.Windows.Forms.AxHost.GetOcx()方法检索的ActiveX对象.

此调用是在WPF事件处理程序中执行的,例如"鼠标单击".

现在问题.如果我们双击'鼠标点击'事件将触发,运行InvokeMember().但是,此调用期间,我们看到重新输入了"鼠标单击"事件.所以在同一个线程中,我们在调用堆栈上看到两次事件处理程序.这是非常意外的,我们正在努力防止这种情况发生.我们怎样才能防止这种情况发生?

我们能想到的唯一原因,为什么它偏偏就是:

  • COM对象是在另一个STA中创建的,因此我们正在执行需要编组的跨STA调用
  • 跨线程STA调用使用Windows消息向COM组件发送RPC请求
  • 跨线程STA调用使用Windows消息泵来接收RPC应答
  • 在等待期间,会出现另一种类型的事件(如"鼠标点击"),并在处理RPC应答之前处理此事件.
  • 这个RPC答案得到处理

我们试图解决问题的方法:

  • 在所有事件处理程序中使用lock().这不起作用,因为lock()将锁定一个线程,在这种情况下,它是重新进入事件处理程序的相同线程.
  • 使用自定义锁定,如'bool locked = false; if(!locked){locked = true; 的InvokeMethod(); ...; locked = false; }".这部分工作:它会丢弃事件而不是将它们排队等待,并且需要对我们所有的事件处理程序进行大量更改,这样做并不好.
  • 使用Dispatcher.DisableProcessing来停止(其他)消息的处理.这没有帮助:它会抛出异常,因为无论如何都要处理消息.
  • 在新线程中创建第二个调度程序,并通过Dispatcher.Invoke()运行ocx.InvokeMehod()以使其由另一个线程处理.这给出了'一个事件无法调用任何订阅者(来自HRESULT的异常:0x80040201)'(是的,我们还订阅了ActiveX对象的COM事件).
  • 使用Dispatcher.PushFrame()来停止发生事件处理.这也失败了.

一个可能有效,但不知道如何实现这一点的疯狂想法将创建一个新的消息泵作为WPF消息泵,可配置为临时只处理RPC调用.这与http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/430/WPF-MediaKit-Updates.aspx一致,但仍与此情况有所不同.

所以问题归结为我们如何能够像我们预期的那样同步进行ActiveX调用而不是异步?

更新

为了更清楚地说明所涉及的机制不仅仅是关于鼠标事件,而是"在执行旧事件时处理新事件"这一更普遍的问题,我将给出另一个堆栈跟踪示例:

上下文:我们有一个WPF网格,我们得到一个鼠标点击(Grid_MouseDown),我们有一个ActiveX对象,我们在其上执行方法'CloseShelf'.打开架子需要时间,所以我们订阅了事件'EventShelfClosed',它在EventShelfClosed的事件处理程序中将调用'ListShelf'来知道剩下哪些架子.

这就是托管堆栈跟踪的样子(Hans要求一个非托管堆栈跟踪,但我不知道如何获得一个):

MyAxWrapper.dll!MyAxWrapper.MyAxWrapper.InvokeMember(string methodName, System.Reflection.BindingFlags flags, object[] args, int refArgIdx) Line 53 C#
MyAxWrapper.dll!MyAxWrapper.LoggingMyAxWrapper.InvokeMember(string methodName, System.Reflection.BindingFlags flags, object[] args, int refArgIdx) Line 151 + 0x14 bytes    C#
MyAxWrapper.dll!MyAxWrapper.MyAxWrapper.InvokeMethod(string methodName, object[] args) …
Run Code Online (Sandbox Code Playgroud)

.net c# com wpf activex

9
推荐指数
1
解决办法
3719
查看次数

通过VC++中的COM实例化C#对象的类未注册错误

在VC++项目中,我试图创建一个包含在C#项目中的C#类的实例(通过COM).

事实

  • C#和C++项目都是使用.NET 4.0编译的
  • C#.dll正在使用regasm/codebase"CSharpProjectName.dll" " 进行注册,并且Windows命令提示符报告,"类型已成功注册."
  • 在c ++项目中,我尝试在C#项目中创建一个类的实例,但是我得到的HRESULT为0x80040154 - 类未注册

以下是我尝试从C#.dll创建.NET对象实例的示例.我试图实例化的具体类叫做Employee,为了简单地提出我的问题,实现了IPerson接口:

    CSharpProjectName::IPersonPtr pPersonPtr;
    HRESULT hr = pPersonPtr.CreateInstance(CSharpProjectName::CLSID_Employee);
Run Code Online (Sandbox Code Playgroud)

即使我使用"regasm/codebase"注册c#.dll并确认注册表中存在密钥,为什么我会收到"未注册类"错误?

任何帮助将不胜感激.谢谢!

.net c# com regasm visual-c++

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

无法使用WiX注册DLL

我正在尝试使用WiX注册DLL.现在我知道并理解我应该使用heat并获取它来为我提取注册表信息,但热似乎失败,并显示以下错误消息:heat.exe : warning HEAT5150 : Could not harvest data from a file that was expected to be a SelfReg DLL: C:\Users\seb\Desktop\Development\addin.dll. If this file does not support SelfReg you can ignore this warning. Otherwise, this error detail may be helpful to diagnose the failure: Unable to load file: C:\Users\seb\Desktop\Development\addin.dll, error: 193

我环顾四周,发现这篇文章解释了有关注册DLL的更多细节,但我想尽可能避免自注册路由.我还看到了下面手动注册DLL的提及,但是我不太了解注册表或COM对象,知道我甚至可以获得CLSID,ProgId以及已经提到的任何其他信息.

如果有人能指出我正确的方向或向我解释我需要做什么来运行DLL通过heat它将不胜感激.

com dll wix wix3.5

9
推荐指数
2
解决办法
5960
查看次数

Coinitialize(零)和CoInitializeEx(0,COINIT_MULTITHREADED)差异

在一个帖子中,如果我使用,是否有区别

Coinitialize(nil)
Run Code Online (Sandbox Code Playgroud)

代替

CoInitializeEx(0, COINIT_MULTITHREADED);
Run Code Online (Sandbox Code Playgroud)

我使用Delphi 7,但我认为其他编程语言可以保留这个问题感谢您的帮助.

delphi com delphi-7

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

当.visible = $ false时,Powershell excel刷新失败并且"Call被Callee拒绝"

我已经有很长一段时间没有这个问题而且只是因为懒惰而忽略了它,但我现在需要找到一个解决方案.我有一个脚本可以自动刷新大量的Excel文档.这很好用,但是,如果我将Visible属性设置为false,则存储在网络共享上的工作簿上会失败.

重申一下,使用设置为false的visible属性刷新在LOCAL文件上工作正常,但保存在\ location上的任何工作簿都会失败,并显示错误"调用被被调用者拒绝".所有刷新工作正常,可见属性设置为true.

这是我的代码:

#Create Excel COM object and set it up for use.
$excel = new-object -comobject Excel.Application;
$excel.DisplayAlerts = $false;
#If this is set to false, saving the file on a network share will fail. Reason : Unknown.
$excel.Visible = $true;
#Open workbook which should be refreshed. 
$excelworkbook = $excel.workbooks.Open($workbook);
#Refresh WB
$excelworkbook.RefreshAll();
#Save
$excelworkbook.Save();
#Quit Excel
$excel.Quit();
#Destroy COM object. (VERY IMPORTANT!!!!!)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel);
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

  1. 在创建excel对象和设置visible属性之间添加Start-Sleep 30
  2. 在DisplayAlerts之前设置可见
  3. 希望它能够真正发挥作用

有任何想法吗?

com excel powershell

9
推荐指数
1
解决办法
2031
查看次数

VBA中自定义COM类中的IntelliSense

有没有办法在VBA中自己构建的COM类中获取IntelliSense?

例如,在下面的示例中,每当我按下点(或ctrl + space for shortcut)时,我想显示"Number": 在此输入图像描述

我想,如果以某种方式解决了这个问题,我还会得到一些关于对象公共函数的信息:

在此输入图像描述

那么,有什么建议?

建议1:

在此输入图像描述

c# com intellisense vba visual-studio

9
推荐指数
1
解决办法
854
查看次数

标签 统计

com ×10

c# ×6

.net ×3

delphi ×2

wpf ×2

activex ×1

c++ ×1

com-hell ×1

delphi-7 ×1

dll ×1

excel ×1

intellisense ×1

interop ×1

opos ×1

powershell ×1

regasm ×1

typelib ×1

vba ×1

visual-c++ ×1

visual-studio ×1

wix ×1

wix3.5 ×1