Tag: vb6

为C6结构暴露了C#struct for VB6 app

最后更新时间: 2009-08-11美国东部时间下午2:30 几天前,我发布了一些关于一些非常奇怪的问题的问题。 好吧,我弄清楚具体是什么导致一台机器上的构建不能在其他机器上运行,甚至想出一个解决方法,但现在它给我留下了一个很好的,具体的问题:为什么? 为了重现这个问题,我创建了一个新的InteropUserControl并执行以下操作: 添加一个新的public struct MyStruct : 给它一个GUID和ComVisible属性 将GetMyStruct成员添加到_InteropUserControl接口并在InteropUserControl实现它。 MyStruct : [Guid(“49E803EC-BED9-4a08-B42B-E0499864A169”)] [ComVisible(true)] public struct MyStruct { public int mynumber; } _InteropUserControl.GetMyStruct() : [DispId(7)] void getMyStruct( int num, ref MyStruct data ); (我已经尝试返回MyStruct而不是通过引用传递。) InteropUserControl.GetMyStruct()实现: public void getMyStruct( int num, ref MyStruct data ) { data = new MyStruct(); data.mynumber = num * 2; […]

接受字节数组,vb6到C#interop

我正在做一个使用加密包装器来管理vb6的应用程序。 到目前为止,.net和interop部分是正常的,完全正常工作。 正如我的客户正在测试它,我只是有一个简单的问题: [ComVisible(true)] public SomeObjectComVisible GetThat(byte[] array){ … } 到目前为止,我使用了暴露给com或int和string的类型,直到现在都没有问题。 是否可以使用(.net) byte或chould我使用*char ? 当我将程序集标记为可见并注册到com interop时,它会为它创建一个包装器,或者我应该使用一些非托管类型? 啊,这是一个vb6,而不是vbscript。 太感谢了 对于那些寻求答案的人: public SomeObjectComVisible GetThat([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)]byte[] array) 问题在于数组。 http://msdn.microsoft.com/en-us/library/z6cfh6e6.aspx和http://msdn.microsoft.com/en-us/library/75dwhxf7.aspx 任何非bittable类型都可以是一件苦差事。 您可以指定自己的类型,以便使用它们,您只需要使用它们 [ComVisible(true), ClassInterface(ClassInterfaceType.None), ProgId(“SomeNamespace.SomeClass”), Guid(“XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”)] 在课堂上 非常感谢大家。 很好的帮助

输出参数有什么问题?

在SQL和C#中,我从来都不喜欢输出参数。 我从未在VB6中传递参数ByRef。 关于计算副作用以完成某些事情的事情让我感到困扰。 我知道它们是一种无法从函数返回多个结果的方法,但SQL中的行集或C#和VB中的复杂数据类型也同样适用,并且对我来说似乎更自我记录。 我的想法有什么问题,还是来自权威来源的资源支持我? 你个人对此有何看法,为什么? 对于想要设计输出参数可能会说服他们使用不同结构的同事,我能说些什么呢? 编辑:有趣的转 – 输出参数我问这个问题用于代替返回值。 当返回值为“ERROR”时,调用者应该将其作为exception处理。 我这样做但对这个想法并不满意。 一位同事没有被告知有必要处理这种情况,因此,由于程序无声地失败,大量资金丢失了!

我应该使用.NET应用程序部署Interop.x.dll文件吗?

我们有一个.NET应用程序,它使用不同DLL中的COM对象,也用于我们应用程序的VB6部分。 在引用COM库时,Visual Studio 2012会创建一个Interop.x.DLL并引用它。 我应该从构建计算机分发Interop.x.DLL还是使用某些.NET命令行工具重新生成它? 什么工具? 部署引用COM的.NET应用程序的最佳实践是什么?

在C#中使用VB6字符串数组

我有(遗留)VB6代码,我想从C#代码中使用。 这有点类似于这个问题 ,但它指的是从VB6传递一个消耗C#dll的数组。 我的问题恰恰相反。 在VB中,一个dll中有一个接口,另一个中有一个实现。 接口: [ odl, uuid(339D3BCB-A11F-4fba-B492-FEBDBC540D6F), version(1.0), dual, nonextensible, oleautomation, helpstring(“Extended Post Interface.”) ] interface IMyInterface : IDispatch { [id(…),helpstring(“String array of errors.”)] HRESULT GetErrors([out, retval] SAFEARRAY(BSTR)* ); }; cMyImplementationClass中的实现(片段): Private Function IMyInterface_GetErrors() As String() If mbCacheErrors Then IMyInterface_GetErrors = msErrors End If End Function 我用tlbimp.exe包装了这两个dll,并尝试从C#调用该函数。 public void UseFoo() { cMyImplementationClass foo; […]

如何将结构从C#发送到VB6,从VB6发送到C#?

我需要将一个结构从C#发送到VB6应用程序,修改VB6中的数据,然后通过Windows消息传递结果。 我该怎么做呢? 我能够使用PostMessage来回发送基本的int(在C#中使用DllImport并使用Windows消息传递注册vb6应用程序),但需要发送更多结构化数据,包括字符串,整数和小数。 寻找最简单的解决方案来实现来回传递结构数据。 VB6类型的基本样本 Public Type udtSessionData SessionID As Integer SessionName As String MinVal As Currency PctComplete As Double NVal As Integer ProcessedFlag As Boolean ProcessedDate As Date Length As Integer End Type

在.Net中使用VB6.dll

我正在使用的vb6代码可以将应用程序“注入”到正在运行的进程中。 实际上它相当于.Net的Reflection。 通过执行以下操作,我成功地通过.Net调用了.dll中的所有vb6函数: 在VB6中创建DLL 在Windows中注册DLL 添加注册的dll作为.Net winform应用程序的参考 创建.dll的实例并调用嵌入式函数。 但是,我没有运气调用下面的代码 – 同样的错误不断出现。 这是一张照片: 错误如下: 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 VB6调用: Project1.Class1 vb6Test = new Project1.Class1(); vb6Test.InjPE(Application.ExecutablePath, File.ReadAllBytes(Application.ExecutablePath)); 注意:当我在vb6项目中使用上述调用时(当不从外部源调用它时),此代码完全正常。 导致错误的代码 Private Declare Sub CopyBytes Lib “MSVBVM60” Alias “__vbaCopyBytes” (ByVal Sz As Long, Dest As Any, Source As Any) Private Declare Function LoadLibraryA Lib “kernel32” (ByVal lpLibFileName As String) As Long […]

如何在文本文件中添加标头

如何在文本文件中添加/追加现有数据的文本开头。 基本上我需要在文本文件中提供此数据之前的标题。 此标头是动态数据。 请注意,此数据来自外部源或SQL包或来自某个地方。 因此,在文本文件中获取数据之后,我想在文本文件的现有条目/数据中提供以逗号分隔的标题文本。 我在文本文件中对数据进行采样,如下所示: 123,”SAV”,”CBS123″,2010-10-10 00:00:00 456,”CUR”,”CBS456″,2012-02-01 00:00:00 要添加的标题文本: HDR 输出我需要如下:TableName: Account DateTime: 2012-05-09 12:52:00 HDRAccount2012-05-09 12:52:00 123,”SAV”,”CBS123″,2010-10-10 00:00:00 456,”CUR”,”CBS456″,2012-02-01 00:00:00 请帮助我如何在VB6.0,C#.NET两种语言中获得相同的function

使用.NET互操作编译VB6应用程序,仅在我的机器上编译时运行

我最近在.NET(Visual Studio 2008,项目目标是.NET 2.0)中开发了一个用于VB6应用程序的互操作用户控件。 该程序集公开了1个控件,1个类,以及一些枚举和结构。 我使用此处的Interop Forms Toolkit 2.0项目模板的C#转换开发了它。 程序集具有强名称,并安装在GAC中,并使用以下脚本在regasm中注册: @”C:\gacutil.exe” /i “C:\Program Files\AppName\Control.dll” /f @”C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe” “C:\Program Files\AppName\Control.dll” /tlb:”C:\Program Files\AppName\Control.tlb” 问题:当我在我的机器上编译VB6应用程序时,它将在任何其他机器上运行(当然,安装了控件)。 但是,当应用程序在不同的计算机上编译时,它将在该计算机上运行,​​但不会在任何其他计算机上运行。 当我说它没有运行时,我的意思是你试图运行它,绝对没有任何反应。 我使用OleView来检查我的机器和其他机器上的控件,并且所有GUID在类型信息中都是相同的。 唯一的区别是一个有行importlib(“stdole2.tlb”)而另一个有importlib(“STDOLE2.TLB”)。 我的机器有:Visual Studio 6.0 sp6,VB6互操作用户控件模板,Windows SDK 6.0和6.0A,Visual Studio 2008 sp1。 这台机器是有效的。 同事机:Visual Studio 6.0 sp6,Visual Studio 2005 另一台机器:Visual Studio 6.0 sp6,Visual Studio 2008. 2008今天早上安装了这个并没有解决问题。 我如何让这些其他机器正确编译VB6应用程序,以便它运行在编译它的机器以外的机器上? (在评论中提出更多信息请求,我将对其进行编辑以提供答案。) 编辑: 关于注册控件的权限提出了建议。 我想澄清控制似乎运作良好。 我在工作的机器和不工作的机器上以完全相同的方式注册它。 当引用控件的VB6应用程序在我自己的机器上编译时,问题就会出现。 […]

C# – 编写COM服务器 – 映射到方法的属性

我们正在尝试替换最初为VB6应用程序编写的COM服务器 我们无法访问源代码。 出于某种原因,VB6应用程序可以调用我们的构造函数,但它得到: 系统错误&H80004002。 没有这样的接口支持。 我假设它试图获取QueryInterface的接口。 我们通过regasm / tlb和gacutil正确发送了我们的程序集,但后来我发现了一些奇怪的东西。 我打开了为程序集生成的.tlb文件regasm,并注意到我界面上的所有属性都显示为方法。 这是.Net工具正在做什么吗? 这会导致我的问题吗? 以下是原始文件的完整tlb定义: // Generated .IDL file (by the OLE/COM Object Viewer) // // typelib filename: UtopiaKeyboard.tlb [ uuid(9B4E1840-FF65-11CF-AA2E-0020AFA49D5A), version(1.0), helpstring(“OPOS POSKeyboard OLE Control”) ] library POSKEYBOARDLib { // TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} importlib(“STDOLE2.TLB”); // Forward declare all types defined […]