Tag: vb6

C# – 编写COM服务器 – 未在客户端上触发的事件

我在C#中实现了一个COM服务器,它有一个vb6客户端。 当我要触发我的事件时,处理程序总是为空 – 看来vb6应用程序从不订阅我的事件。 vb6应用程序是现有的第三方应用程序,似乎没有提供任何错误消息。 普通方法可以在COM客户端 – >服务器上正常工作。 我可以做些什么来调试正在发生的事情? 或者为什么我的活动不起作用? 以下是我的代码的快速示例代码段: [ComVisible(true), Guid(Constants.CLASS_IID), ProgId(Constants.PROG_ID), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IMyServiceEvents))] public class MyClass : Control, IMyService, IMyServiceEvents { [DispId(1)] public event MyEventHandler MyEvent; //… also implements IMyService, which is working } [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), Guid(Constants.EVENTS_IID)] public interface IMyServiceEvents { [PreserveSig, DispId(1)] void MyEvent([In]int Status); } [ComVisible(false)] public delegate void MyEventHandler(int […]

COM Interop与VB6和C#

我正在编写一个将由VB 6程序使用的C#COM对象。 这应该不是什么大问题,但是,对COM对象的VB6调用传入VB控件(在本例中为TextBox)。 程序期望COM对象更改控件的Text属性。 不幸的是,我必须坚持这个界面,因为我正在处理其他人遗留代码。 如何设置传递的TextBox的属性? 我只是创建一个具有Text属性的接口并将input转换为该接口吗? 这有可能吗? 如果我需要澄清,请告诉我。 注意:我打算在以下代码中省略COM声明。 // C# COM Object Interface public interface IObj { // This function must receive the argument of type object. void Test(object input); } // C# COM Object Implementation public class Obj : IOjb { // A VB6 TextBox is passed into here, // expecting a […]

在C#中进行XOR绘图

我正在努力学习C#.Net。 我曾经在VB中写过小(爱好)模拟时钟应用程序(编辑:VB6,确切地说),我想我会在C#.NET中重写,作为我学习过程的一部分。 在VB应用程序中,我在XOR Drawmode中画了时钟,所以我必须移动秒针,我只需要在之前的位置重绘它然后绘制当前位置 – 我不需要刷新整个表格。 我所做的只是 Me.DrawMode = vbNotXorPen 然后 Me.Line… 在VB表格上 在C#中,我找不到等效的Xor Pen Draw模式。 我发现 ControlPaint.DrawReversibleLine 在网上的某个地方,但我不确定ControlPaint是否用于这样的目的(我根据ControlPaint正在绘制的坐标系统而不理解) 在C#.NET中是否有等效的XOR绘图? 或者有更好的方法来做我正在做的事情(具有最佳性能) (VB和C#都是我的爱好。所以无论我错在哪里都随时纠正我)

控制台应用程序启动另一个无法访问的流程环

我有一个VB6可执行文件,它访问一些系统环境变量。 我已经实现了一个.NET控制台应用程序,它检查这些环境变量是否存在,如果需要的话创建它们,然后通过调用Process.Start运行VB6应用程序。 这样做,VB6应用程序找不到环境变量,它说它们不存在。 如果我从Windows资源管理器运行VB6应用程序,它工作正常,可以找到变量。 所以似乎VB6应用程序在.NET控制台应用程序的上下文中运行,无法访问系统环境变量! 用于设置环境的代码vars .NET Cosnole app: foreach(var varObject in Variables) { var envVar = Envrionment.GetEnvironmentVariable(varObject.Name , EnvironmentVariableTarget.Machine); if(string.IsNullOrEmpty(envVar) { Environment.SetEnvironmentVariable(varObject.Name,varObject.Value, EnvironmentVariableTarget.Machine); } } 从.NET Cosnole应用程序运行VB6应用程序的代码: var processInfo = new ProcessStartInfo(VB6ApplicationFilePath); processInfo.UseShellExecute = true processInfo.WindwoStyle= ProcessWindowStyle.Hidden; Process.Start(processInfo);

在64位Windows 7上的.net桌面应用程序中使用vb6 dll

我在桌面.net 3.5应用程序中使用旧的vb dll时出现问题。 我最近得到了一台运行64位Windows 7的新计算机,而旧的计算机是32位。当我从dll创建类的实例时,我遇到了这个exception。 dll的名称以Interop.DllName开头。 这是例外: 由于以下错误,检索具有CLSID {C198B362-6AE8-4DC3-A3E9-5DA5E60B326F}的组件的COM类工厂失败:80040154。 使用regsvr32在注册表上注册dll没有问题,但是当我试图使用RegDllView找到dll时,我找不到它。 Thanx的帮助!

有没有办法将消息从C#.NET程序集(ActiveX)发送到VB6应用程序?

此问答指的是并且可以用于foll。 用途: 通过ActiveX dll从IE浏览器发送消息到vb6应用程序 从ActiveX DLL发送消息到vb6应用程序 将消息从C#.net(dll)发送到vb6应用程序 我读过这篇文章,但似乎并不十分清楚我的目的…… 我还提到了这篇文章来创建ActiveX对象并实现了一个ActiveX dll,我从浏览器调用它来在客户端启动应用程序.dll检查VB6 exe(进程)是否正在运行,否则运行exe。 如果exe已经运行,那么我想将参数/消息传递给exe应用程序。 但我无法获得解决方案或参考样本来实现从此C#.NET程序集(ActiveX)向VB6应用程序发送消息的方法…我可以访问.NET和VB6应用程序的源代码。 .. 我尝试过使用: – Process[] processes = Process.GetProcessesByName(“MyProgram”); foreach (Process p in processes) { IntPtr pFoundWindow = p.MainWindowHandle; // how do I pass a value to MyProgram.exe ? // } 我也试过这个:使用以下链接的帮助,但这不是我正在寻找的解决方案!: – e [C#]在其他程序上读取/写入文本框此代码已在我的activeX DLL上实现,它启动了VB6 App ..我正在通过.NET(进程)检查exe是否正在运行,如果没有,则启动它。 如果exe正在运行,那么我使用上面的文章代码示例通过设置控件(mycase中的文本框)向vb6应用程序发送消息…非常有用的代码..以下代码复制自: – c#reading&writing textbox在其他计划上 public class […]

将持久的ADO 2.8 COM记录集转换为ADO.Net DataSet

我有一个VB6应用程序,我转换为.net。 我正在分阶段这样做,所以客户端将同时具有VB6和.net应用程序。 部分应用程序将ADO 2.8 COM记录集缓存到SQL Server中的表,并根据需要检索它们。 .net应用程序使用相同的持久记录集。 我有c#代码检索持久化记录集并将其转换为数据集。 我的问题是 – 我是否以最有效的方式做到了? 这是我从数据库中检索记录集的代码 – Stream adoStream = null; SqlParameter cmdParameter; SqlCommand cmd = null; SqlDataReader dr = null; string cmdText; int bytesReturned; int chunkSize = 65536; int offSet = 0; UnicodeEncoding readBytes; try { cmdParameter = new SqlParameter(parameterName, idParamter); cmdText = sqlString; cmd = new SqlCommand(); […]

错误激活IInterceptor …只能通过COM?

TL; DR: Kernel.Get在从.net / WPF应用程序调用时起作用,但是当从VB6应用程序调用时,会发生内部ActivationException (在TargetInvocationException内部)。 WTH? 这是对这个问题的一个跟进,我在这个问题中配置了一个具有Ninject约定的抽象工厂,这样我就不需要实际实现一个,Ninject工厂扩展负责生成一个动态。 这很好用……直到我需要从VB6代码运行我的库。 _kernel.Bind(t => t.FromAssemblyContaining(typeof(ViewModelBase)) .SelectAllInterfaces() .EndingWith(“ViewFactory”) .BindToFactory()); 一旦我从VB6代码调用应用程序上的任何内容,如果我将依赖项的解析包装在try / catch块中,我将使用内部ActivationException捕获TargetInvocationException : 使用IInterceptor Provider的条件隐式自绑定激活IInterceptor时出错返回null。 激活路径: 3)将依赖性IInterceptor注入到IViewFactoryProxy类型的构造函数的参数中 2)将依赖IViewFactory注入到MsgBox类型的构造函数的参数viewFactory中 1)请求IMsgBox 建议: 1)确保提供程序正确处理创建请求。 我没有引用Ninject.Interception扩展(此时)。 奇怪的是,如果不是启动VB6,我在调试时启动沙盒WPF测试应用程序,我没有得到任何ActivationException ,一切都像魅力一样。 VB6代码死于automation error -2146232828 (80131604) ,谷歌没有产生任何结果,但我猜它与抛出的TargetInvocationException 。 就.net代码而言, 它只是起作用 :如果我从WPF客户端编写应用程序,我可以在MsgBox类构造函数中查看并看到IViewFactory参数对IViewFactory感到满意; 如果我从VB6 ActiveX DLL编写应用程序(我还创建了一个VB6 EXE进行测试,并且与DLL相同),它会爆炸。 UPDATE 我删除了通用抽象工厂,我不再收到此错误。 因为我不想写工厂,所以我采取了一些更紧密的耦合,我可以忍受。 现在我想知道为什么会这样!

通过C#的COM互操作提高正VB样式错误代码

我有一个在VB6中创建的基础库,它公开了一个在许多应用程序中使用的标准COM接口。 这也暴露了许多错误代码常量,与Err.Raise用于指示某些条件。 Public Enum IOErrors IOErrorBase = 45000 IOErrorConnectionFailed IOErrorAuthFailed IOErrorNotConnected IOErrorInvalidPortDirection IOErrorGettingValue IOErrorNoValueYet End Enum 经过10年,我们正在创建实现相同接口集的C#对象,并希望以调用应用程序识别它们的方式抛出exception。 我只能找到两个相关的类, Win32Exception和COMException 。 抛出Win32Exception((int)IOErrors.IOErrorConnectionFailed, “Connect failed”)正确传递消息,但忽略错误代码, Err.Number为&H80004005 。 抛出COMException(“Connect failed”, IOErrors.IOErrorConnectionFailed)导致调用应用程序中没有错误被COMException(“Connect failed”, IOErrors.IOErrorConnectionFailed) ,大概是因为错误代码不是HRESULT而且是肯定的,这意味着成功。 TL; DR如何从C#中抛出exception,以便COM互操作将其转换为上面的一个已识别(正)错误代码?

在C#(或一般的.NET)中,您是否可以屏蔽通过属性抛出exception的调用堆栈级别?

标题可能有点令人困惑所以我会解释。 说你有这个电话链…… public DoWork(index) >> private DoWorkHelper(index) >> private CheckIndex(index) 现在,如果您调用DoWork ,它会将调用遍历到CheckIndex ,将每个更深的调用添加到调用堆栈。 现在,如果某人使用错误的index值调用DoWork ,它会在CheckIndex一直抛出exception,而且当前,这就是调试器中断的地方。 然后你必须走回调用堆栈才能看到真正的犯罪者是有人将坏数据传递给DoWork 。 现在回到VB6时代,你可以简单地用一个属性装饰DoWorkHelper和CheckIndex来说’如果我内部抛出任何exception,请不要突出显示我,而是突出我的调用者,因为他们是那些通过我糟糕废话的人!’ 因此,在这种情况下,代码将在DoWork突破, DoWorkHeper突出显示对DoWorkHeper的调用。 还有一个设置可以禁用它,所以为了更深层次的调试目的,它仍然可以抛出CheckIndex ,它实际发生的级别,但有一半的时间,那里的故障告诉你什么都没有,因为你不知道你是怎么到达那里的走回调用堆栈。 可以认为这是一种装饰代码的方法,可以说明当你遇到exception时,自动遍历调用堆栈到坏值实际告诉你有用的地方。 请注意,这类似于“Break On All Exceptions”,除非您通过装饰处理此问题。 另外,您没有设置中断特定类型的exception(例如所有空引用exception等),而是特定方法! (或者更准确地说,是一种称为装饰方法的那种。) 那么C#或.NET一般都有这个吗? 更新 虽然我向Dark Falcon提供了答案,因为他指导我在那里,我已经添加了一个更详细的解释,说明所有属性的含义,以及在什么情况下。 请在下面查看。