我正在研究在Delphi程序中使用一些.NET代码,我需要使用.net程序集和预定义函数使我的程序可扩展(我已经支持常规DLL).
经过大量的在线搜索后,我找到了 Managed-VCL,但我还没准备好为我需要支付250美元,我还发现了一些代码不完整但不起作用的新闻组.
我正在使用Delphi 2007 for win32.我可以使用什么来从具有预定义参数的程序集动态执行函数?
就像是:
procedure ExecAssembly(AssemblyFileName:String; Parameters: Variant);
Run Code Online (Sandbox Code Playgroud)
我只想补充一点,我需要能够加载任意程序集(可能是特定文件夹中的所有程序集),因此创建C#包装器可能无法正常工作.
我有一个.Net Froms应用程序,它通过WebBrowser控件显示网页.
无论如何,我可以检测到控件是否显示" 找不到页面 "或" 无法显示网页 "错误?似乎没有任何错误事件处理程序.
我刚刚开始了一项涉及大量COM编程的新工作.到目前为止,我已经做好了,继续我的COM基础知识,这是我作为开发者的旅程,但我是那种需要了解一切的人.因为我不知道这些东西是如何工作的,所以整天和COM一起工作让我很烦.
是否有从头开始创建基本COM对象的简单步骤?我的意思是一切.没有Visual Studio,没有ATL.只是编译器和记事本.
它比使用getopt()解析C/C++中的命令行参数要容易得多.
Delphi有类似的东西吗?或者理想情况下,使用相同的语法?我知道Delphi支持FindCmdLineSwitch和ParamStr(),但那些仍然需要一些额外的解析.
我想要一些像C语言中的getopt()一样的东西.它可以轻松地允许基本的切换开关,以及在切换后捕获值.请参阅下面的一些示例C代码,看看我在说什么:
void print_help()
{
printf("usage:\n") ;
printf("\t\t-i set input file\n") ;
printf("\t\t-o set output file\n") ;
printf("\t\t-c set config file\n") ;
printf("\t\t-h print this help information\n") ;
printf("\t\t-v print version\n") ;
}
char* input_file = NULL ;
char *query=NULL;
char opt_char=0;
while ((opt_char = getopt(argc, argv, "i:q:vh")) != -1)
{
switch(opt_char)
{
case 'h':
print_help();
exit(-1);
break;
case 'v':
print_version() ;
exit(-1) ;
break ;
case 'i':
input_file= optarg ;
break ;
case 'q':
query= optarg ;
break …Run Code Online (Sandbox Code Playgroud) 我需要将一些遗留的32位代码(我没有源代码)集成到一个项目中,以便可以从64位.NET程序集中调用它.原始代码在DLL中实现为32位COM对象.Windows不允许从64位到32位对象的直接调用,所以我正在寻找如何处理这种情况的灵感.
如何从64位.NET程序集访问传统的32位COM对象?
更新:我们发现COM组件本身就是一些ANSI C的包装器,我们为它提供了原始源代码.我们能够在Visual Studio中将其编译为本机64位dll,并将其导入.NET - 抱歉移动球门柱!
我有一个通过COM Interop调用的托管程序集.像VBScript客户端,Perl客户端等.
课程装饰有
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]
Run Code Online (Sandbox Code Playgroud)
然后当然我做了regasm的事情,所有方法都运行得很好.
但是程序集中也有枚举类型.我想使用符号名称COM应用程序,用于枚举值.
如何通过COM互操作公开枚举?我只需要添加这些属性吗?
[GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
[ComVisible(true)]
Run Code Online (Sandbox Code Playgroud)
然后,我如何在VBScript中引用这些符号名称?我没有看到OleView中的枚举类型.(我应该?)我在OleView中看到了所有其他类型.
使用Perl,使用Win32::OLE库加载COM/OLE对象并控制它们非常容易.我遇到的问题是确切地知道我正在访问的对象中有哪些方法和属性可用.其他语言中的某些OLE工具包可以通过读取对象上可用的所有属性和方法为您生成静态接口.Perl的Win32::OLE库中是否存在这样的工具?
执行以下两个测试用例后,将向控制台打印COM执行.我究竟做错了什么?
如果我单独运行任一测试,或者如果我同时运行两个测试,则会将异常写入控制台一次.这让我怀疑是否存在某种我不会清理的每AppDomain资源.
我已尝试使用NUnit和MSTest进行测试,在两种环境中都具有相同的行为.(实际上,我不确定在MSTest中运行这两个测试是否会导致一个或两个异常打印输出.)
例外:
System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.
at System.Windows.Input.TextServicesContext.StopTransitoryExtension()
at System.Windows.Input.TextServicesContext.Uninitialize(Boolean appDomainShutdown)
at System.Windows.Input.TextServicesContext.TextServicesContextShutDownListener.OnShutDown(Object target)
at MS.Internal.ShutDownListener.HandleShutDown(Object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)
测试代码:
using NUnit.Framework;
namespace TaskdockSidebarTests.Client
{
[TestFixture, RequiresSTA]
public class ElementHostRCWError
{
[Test]
public void WinForms()
{
var form = new System.Windows.Forms.Form();
var elementHost = new System.Windows.Forms.Integration.ElementHost();
form.Controls.Add(elementHost);
// If the form is not shown, the exception is not printed.
form.Show();
// These lines are optional. The exception is …Run Code Online (Sandbox Code Playgroud) 我无法在VS2012中添加对"Microsoft Windows Installer对象库"的引用.任何想法,什么可能导致这个问题?
当我尝试创建COM组件的引用时,我收到此错误消息"无法添加对'Microsoft Windows Installer对象库'的引用".
VS项目是基本类库(c#x86).