在我工作的公司中,我们使用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文件.
我有一个带有以下签名的假设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++分配数组的合适方法是什么?谢谢.
对于一些传统POS应用程序的互操作,我想知道是否有可能在C#中实现虚假的OPOS设备.
基本上我会实现一个虚假键盘,它接受Web请求并将按键传递给遗留应用程序.
有谁知道这是可能的还是在哪里获得文件?我认为OPOS刚刚调用了由注册表项配置的COM对象.所有这些都应该在C#中实现.
COM技术似乎已经过时了,但仍在使用中.但是,在构建.NET应用程序时,特别是在WPF中,建议采用什么方法来实现相同类型的互操作性?
即什么是COM对象的现代替代品?
我们在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().但是,在此调用期间,我们看到重新输入了"鼠标单击"事件.所以在同一个线程中,我们在调用堆栈上看到两次事件处理程序.这是非常意外的,我们正在努力防止这种情况发生.我们怎样才能防止这种情况发生?
我们能想到的唯一原因,为什么它偏偏就是:
我们试图解决问题的方法:
一个可能有效,但不知道如何实现这一点的疯狂想法将创建一个新的消息泵作为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) 在VC++项目中,我试图创建一个包含在C#项目中的C#类的实例(通过COM).
事实
以下是我尝试从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并确认注册表中存在密钥,为什么我会收到"未注册类"错误?
任何帮助将不胜感激.谢谢!
我正在尝试使用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它将不胜感激.
在一个帖子中,如果我使用,是否有区别
Coinitialize(nil)
Run Code Online (Sandbox Code Playgroud)
代替
CoInitializeEx(0, COINIT_MULTITHREADED);
Run Code Online (Sandbox Code Playgroud)
我使用Delphi 7,但我认为其他编程语言可以保留这个问题感谢您的帮助.
我已经有很长一段时间没有这个问题而且只是因为懒惰而忽略了它,但我现在需要找到一个解决方案.我有一个脚本可以自动刷新大量的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)
我尝试过以下方法:
有任何想法吗?