2运行程序vb6和c# - 在它们之间传输一个简单的字符串

时间:2009-10-10 04:11:13

标签: c# vb6

有一个很简单的方法可以做到这一点......它只是一个简单的字符串在c#我想要转到一个旧的vb6应用程序,稍后将重写,不需要一个扩展的框架,只需一个快速而肮脏,但可靠的方法 - 谢谢!

另外,我可以修改vb6代码

6 个答案:

答案 0 :(得分:1)

根据您拥有的组件,您可以从c#广播vb应用程序可以接收的消息。

在C#端你需要做一些类似于VirtualAlloc(hMem)的东西,在那个内存中上传字符串数据,使用RegisterWindowMessage(idMsg)获取一个唯一的WM_消息,SendMessage(HWND_BROADCAST, idMsg, hMem, 0);,之后的清理自己使用VirtualFree。

在VB方面,你需要对你的窗口进行子类化(你可以为此获得.ocx控件,稍微谷歌)并在你注册相同的消息后,听听它。一旦收到它,你会得到一个指向你的字符串的指针。此时,您可以使用rtl函数从指针中检索数据,或者只是将其传递给com对象,并让它返回一个可以在VB中本机使用的com字符串。

希望这有帮助!

答案 1 :(得分:1)

您可以使用DDE,它专门用于在VB6中的应用之间进行通信。它可以在.Net中使用,但是DDE是一种较旧的通信方法,并且在.Net中并没有得到很好的支持。

我使用NDdE完成了它,但即使不再维护或支持它。

但是,如果您愿意调查,请点击以下链接: http://ndde.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=4828

效果很好,但由于缺乏支持,这可能不是你最好的选择。

因为看起来你正在寻找真正简单的东西并且你并不关心它是一个黑客,你总是可以只是将消息发布到共享数据库,或者将文件写入预先 - 确定的位置,让两个应用程序看起来。 Web服务是一种选择,但我怀疑VB6有很多支持。 (自从我使用VB6以来已经有好几年了,所以我不知道有哪些第三方选项适用于此。)

答案 2 :(得分:1)

最好的方法是通过ROT(运行对象表)。 Here is a sample

您在ROT中注册对象并使其可被其他应用程序发现。该示例注册了一个C#对象,在VB6中只需要GetObject(, "ROTProviderDotNetDlg.COMROTVictim")来访问它。然后你可以调用方法,设置属性等。

可以用相反的方式完成 - 一个VB6对象可以在ROT中注册,然后由C#app访问以调用VB6对象上的方法。

答案 3 :(得分:0)

如果VB6程序已在运行,您可以使用进程外COM对象(ActiveX exe)作为中间人吗?像this answer of mine这样关于MatLab和VB之间的沟通 如果从C#程序启动VB6程序,只需将VB6程序本身作为ActiveX exe。或者只是在命令行上传递字符串。

答案 4 :(得分:0)

在vb6上设置文本框,文本框上的事件由文本框窗口上的sendcomand引发,只需捕获为每个事件找到正确值所需的事件,我使用了双击

答案 5 :(得分:0)

总是让我感到沮丧的是,这并不是一种超级简单的方法。

命名管道也许......仅仅是为了简单的分享而做的很多。