对,最初跑了:
c:\regsvr32 Amazing.dll
Run Code Online (Sandbox Code Playgroud)
然后,(不小心 - 我可能会补充)我必须再次运行它,并且(确实)在发布'Amazing.dll'的新版本时再次运行它.是的 - 我现在知道我应该跑:
c:\regsvr32 /u Amazing.dll
Run Code Online (Sandbox Code Playgroud)
事先 - 但是嘿!我忘了.
为了切入追逐,当在VS中添加COM引用时,我可以看到3个'Amazing'实例都指向同一个位置(c:\ Amazing.dll),运行regsvr32 /u会删除其中一个引用,第二次 - 是没有...
我如何摆脱这些参考?我在看一个注册方案吗?-如果是这样的-什么究竟,如果我删除的关键之一发生???
干杯
我需要使用R工具中包含的gcc编译器(R用于windows的统计程序)编译我的一些代码,问题是我需要在我的代码中使用IDispatch来创建访问COM对象的方法,以及gcc编译器不支持我用来执行的大部分代码,这基本上是C++代码.
所以我的问题是如何在C中使用IDispatch来创建COM对象,而不必依赖于MFC,.NET,C#,WTL或ATL.我相信如果我这样做,我将能够毫无问题地编译我的代码.
我维护一个可以通过COM自动化的程序.通常客户使用VBS来编写脚本,但我们有几个客户使用Matlab的ActiveX支持,并且在使用NULL参数调用COM对象方法时遇到问题.
他们已经问过他们是如何在Matlab中做到这一点的 - 而且我已经在Mathworks的COM/ActiveX文档中搜索了一天左右,现在无法弄明白.
他们的示例代码可能如下所示:
function do_something()
OurAppInstance = actxserver('Foo.Application');
OurAppInstance.Method('Hello', NULL)
end
Run Code Online (Sandbox Code Playgroud)
这里NULL就是另一种语言,我们会写NULL或nil或Nothing或,当然,传中的对象.问题是这是可选的(并且这些在大多数情况下都是作为可选参数实现的,但并非所有情况都是如此) - 这些方法经常会出现NULL.
他们告诉我,他们已经尝试过[](从我的阅读似乎是最有可能的),以及'',Nothing,'Nothing',None,Null,和0.我不知道有多少甚至是有效的Matlab关键字 - 在这种情况下肯定都不起作用.
有人可以帮忙吗?什么是Matlab的空指针/对象的语法用作COM方法参数?
更新:感谢您到目前为止的所有回复!不幸的是,没有一个答案似乎有效,甚至没有libpointer.在所有情况下错误都是相同的:
Error: Type mismatch, argument 2
COM类型库中的此参数在RIDL中描述为:
HRESULT _stdcall OurMethod([in] BSTR strParamOne, [in, optional] OurCoClass* oParamTwo, [out, retval] VARIANT_BOOL* bResult);
Run Code Online (Sandbox Code Playgroud)
有问题的coclass实现了从IDispatch下降的单个接口.
我意识到这是一个早期发布并且不稳定.我不会梦想在任何其他项目中替换IE9的默认webbrowser控件,但在这种情况下我特别需要IE9与其他版本进行比较.
我想让.NET WebBrowser控件使用IE9而不是机器上的默认IE版本.我可以完全控制机器,因此破解系统文件或其他任何可能需要的东西都没有问题.
通常,这可以通过将更新安装到IE来实现,但在IE9的情况下,它会安装一个单独的应用程序,使IE的当前版本保持不变.这意味着WebBrowser控件继续使用当前版本(这很有意义并且是MS的智能举措,因为IE9仍处于开发阶段).但在我的(边缘)情况下,我需要WebBrowser控件来使用IE9.
是否可以在.NET表单应用程序中嵌入IE9?
编辑
在Hans Passant的帮助下,我得到了更多.在IE9的prog文件目录中发生了一些非常有趣的事情.有一个名为"iepreview.exe.local"的目录,当删除时,会使IE9预览应用程序使用IE8(使用acid3测试检查).
不是我想要的,但我想知道这是否是我可以根据我的需要进行的某种重定向.
编辑2
我已经尝试将.local hack应用于我的iexplore.exe和我的.NET应用程序的副本,我注意到其他有趣的东西 - 两个应用程序都开始使用IE7而不是IE8(我的IE版本)或IE9.
这可能是iexplore试图使用IE9然后再回到IE7?看起来很奇怪它甚至可以使用IE7,但这是它开始使用的useragent字符串.
我有一个使用COM DLL的VB6应用程序.DLL是用C#编写的.在C#项目属性中,我选中了"Register for COM interop"选项.VB6应用程序在我的开发机器上运行良好.C#代码完全遵循以下格式:CodeProject C#COM示例
当部署到其他计算机时,Regsvr32.exe在我尝试注册DLL时出现以下错误:
The module "MyCOM.dll" was loaded but the entry-point DLLRegisterServer was not found.
Run Code Online (Sandbox Code Playgroud)
这是什么意思?没有教程/文档我读过关于COM DLL的任何关于"入口点DLLRegisterServer"的内容.
我们在不同的机器上使用RegAsm.exe时遇到了MAJOR问题,因此我们真的需要一个解决方案,我们可以运行regsvr32.exe,它将适用于我们部署到的任何机器(即XP,Vista,Windows 7,x86机器,x64)机器等)
我需要将哪些内容添加到我的C#代码中才能使其可以使用regsvr32.exe进行注册?
我必须在我的.NET应用程序中使用第三方非托管COM dll.我需要修改此程序集以生成自定义RCW.为了编辑Interop程序集,我需要特定程序集的类型库.可以任何人解释我如何从非托管COM DLL生成类型库?
regsvr32中没有选项来生成类型库.
谢谢你,最诚挚的问候,Robo.
我有一个使用OLE自动化编组器的DCOM客户端和服务器应用程序.它们在同一台PC上运行时工作正常,但当服务器位于不在同一域的不同PC上时,我得到E_ACCESSDENIED(0x80070005).
服务器PC配置了dcomcnfg,以便为我在客户端上指定的登录名和密码的用户提供对任何DCOM对象的所有访问权限.ServerApp及其类型库已在服务器pc上注册.
类型库也在客户端PC上注册.我直接在ClientApp中指定服务器名称,因此据我所知,客户端PC上不需要dcomcnfg配置.
具有服务器名称,登录名,域名和密码的CreateInstanceEx()工作正常.它返回IUnknown,同时在服务器PC上启动ServerApp.
但是当我尝试使用QueryInterface()获取服务器支持的接口时,我得到了E_ACCESSDENIED.
分析安全事件日志,我有两条记录:
首先,我在ClientApp中指定其凭据的用户成功进行网络登录.当我调用CreateInstanceEx()时会发生这种情况.
接下来,我在客户端PC上登录的用户登录尝试失败.由于两台PC不在域中,因此服务器PC不知道该用户.
现在,为什么这个用户会登录到服务器,特别是当我调用所有东西的QueryInterface时?
研究CreateInterfaceEx参数,似乎有某种模仿机制正在进行中.但目前还不清楚是谁冒充了谁.涉及三个用户凭据:
ServerApp在服务器PC上运行的用户(在dcomcnfg中配置).
连接时ClientApp指定凭据的用户.
ClientApp在客户端PC上运行其凭据的用户.
无论你如何看待它,如果涉及#3,那么它就是一个用户.如果DCOM要在服务器PC上识别/模仿#3,为什么我需要指定#2的凭证?到了什么地步?
DCOM冒充#2似乎是合乎逻辑的,因为这是我明确指定为我的凭据.但为什么第二次登录尝试呢?
有人可以解释模仿是如何工作的,还有一种方法可以忽略它并以dcomcnfg中指定的用户身份运行?
我想从Go运行WMI查询.有一些方法可以从Go 调用DLL函数.我的理解是必须有一些DLL,通过正确的调用,将返回一些我可以解析和使用的数据.我宁愿避免调用C或C++,特别是因为我猜它们是Windows API本身的包装器.
我已经检查了输出dumpbin.exe /exports c:\windows\system32\wmi.dll,以下条目看起来很有希望:
WmiQueryAllDataA (forwarded to wmiclnt.WmiQueryAllDataA)
但是我不知道该怎么做.这个函数有什么参数?它返回了什么?搜索WmiQueryAllDataA没有帮助.并且该名称仅出现在注释中c:\program files (x86)\windows kits\8.1\include\shared\wmistr.h,但没有功能签名.
有更好的方法吗?还有另一个DLL吗?我错过了什么吗?我应该只使用C包装吗?
使用.NET Reflector在Linqpad中运行WMI查询显示了WmiNetUtilsHelper:ExecQueryWmi(和_f版本)的使用,但都没有可见的实现.
更新:使用github.com/StackExchange/wmi包,该包使用接受答案中的解决方案.
我的php应用程序遇到了问题.我正在构建一个应该连接到我们的ERP(选择线)的服务应用程序.
但我无法创建一个COM对象.这段代码:
<?PHP
error_reporting(E_ALL);
session_start();
date_default_timezone_set('Europe/Zurich');
echo time();
$obj = new COM("fd6c8b29-e936-4a61-8da6-b0c12ad3ba00") or die("Unable to instantiate Word");
echo "Loaded Word, version {$word->Version}\n";
?>
Run Code Online (Sandbox Code Playgroud)
归还给我:
致命错误:在第21行的C:\ xampp\htdocs\com.php中
我有两个环境:
Server 2008 R2 + Xampp v3.1.0 | PHP 5.4.7
Server 2012 R2 + Xampp v3.1.0 | PHP 5.4.7
我不得不在php.ini中添加php_com_dotnet.dll,因为我之前找不到COM类.
由于我是COM的新手,我不知道在哪里搜索失败.
愿你们帮帮我吧.
提前致谢
我改变了我的代码:
try {
$obj = new COM("word.application") or die("Unable to instantiate Word");
} catch (Exception $e) {
echo $e->getMessage() . "\n";
}
Run Code Online (Sandbox Code Playgroud)
现在我得到:
无法创建COM对象`word.application':语法无效
我没有弄到什么问题.根据这篇文章http://www.php.net/manual/en/class.com.php,不需要额外的参数,对吧?
我正在浏览Windows 8.1 SDK和UnknownBase.h中的内容
typedef interface IUnknown IUnknown;
Run Code Online (Sandbox Code Playgroud)
我以前从未见过这个interface关键字.请注意,这绝对是一个.h标题,由处理cl.exe.它不是IDL文件,它不会被处理midl.exe.
我在网上找到了这个:http://msdn.microsoft.com/en-us/library/50h7kwtb.aspx
但是__interface不一样interface
有人能在这里提醒我吗?