在新的 Visual Studio Express (C++ prefrred) 项目中使用旧版 (VB6) DLL

Posted

技术标签:

【中文标题】在新的 Visual Studio Express (C++ prefrred) 项目中使用旧版 (VB6) DLL【英文标题】:using a legacy (VB6) DLL in new visual studio express (C++ prefrred) project 【发布时间】:2012-05-21 01:38:22 【问题描述】:

我有一个旧的遗留应用程序,用于通过串行端口与嵌入式控制器通信总线进行通信。别人开发的。

该应用程序是用 VB6 编写的,结构为两个项目 - 一个用于处理连接和通信逻辑的 DLL,以及一个应用程序 GUI 项目。

我希望能够编写一个新的应用程序 GUI(最好用 C++)来按原样使用现有的 DLL,但是我在解决如何导入它时遇到了很多问题。

所以我想知道,是否可以将这个旧 DLL 原样用于 C++ 项目?或者是否可以导入到 C# 项目中?还是 VB.NET 项目? (宁愿不使用 VB,但如果必须,可以)

我现在在哪里:

我有现有的已编译可执行文件和 DLL,它们在我的系统上运行。

我也有项目文件,它们都可以在 notepad++ 中读取,但我没有 VB6,并且将项目导入 Visual Studio VB.NET 2008 Express 一点也不简单。尤其是没有一个工作示例可以先挖掘和使用(DLL 项目可能是可导入的,但在升级报告中有 50 多个需要更改的内容。它似乎也忽略了三个对我来说非常重要的 .cls 文件不是特别精通 VB6 的眼睛......应用程序项目在升级报告中有一条关于“缺少设计时许可证”的消息,并且实际上似乎进入项目资源管理器的导入项目的唯一项目文件是项目文件本身,以及程序集信息文件。)

关于如何将 DLL 导入 VS C++ 的大多数示例都假设您有一个解决方案,该 DLL 项目与您的项目一起很好地编译,将使用它。或者至少是一个 .DLL 和 .lib 和 .h 文件...我与代码的原始开发人员交谈(在另一个城市,我们不直接工作)并得到一个 .lib 来匹配我的 .dll,但仍然没有 .h 文件。

我通常可以通过一些新的东西来抨击,但是即使在 VB6 中也没有项目的基线工作示例,我可以从中获得理解,这使得这非常困难。此外,谷歌在网上找不到类似的问题,这让我想知道这是否是我应该尝试的事情。

我正在努力获取 Visual Studio 的非 Express 副本,如果这会产生任何影响(到目前为止,Express 对所有内容都很好,所以我再也不需要任何东西了)但这将需要数周时间,很可能.

非常感谢任何建议。

感谢阅读!

【问题讨论】:

【参考方案1】:

我必须否认这一点,因为我没有这样做的经验,但只是发现通过阅读有关该主题的文档应该是可能的。

如果有很多低级别的事情发生,我不确定您是否会在 VB 到 .NET 的导入/转换过程中获得成功。现有的 dll 很可能是一个 COM 对象,不是吗?

似乎有一些 MSDN 文档可以帮助您从 C++ 开始使用 COM 对象 dll - 并且看起来 #import 指令也会生成一些 .h(标头)文件。

http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx

所以我会尝试简单地为它添加一个#import 指令。

#import "somelibrary.dll"

并查看 Visual Studio 生成的内容。

看看下面的例子,(从另一个论坛无耻地复制)

 #import "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll"
 using namespace VBTestLib;

void CDialogTestDlg::OnButton1() 


 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   
 

【讨论】:

感谢您花时间回答!不幸的是,我有一段时间没有机会再看这个问题了,有机会我会试试这个建议!

以上是关于在新的 Visual Studio Express (C++ prefrred) 项目中使用旧版 (VB6) DLL的主要内容,如果未能解决你的问题,请参考以下文章

为啥从 Visual Studio 2008 中删除了在新 ATL 项目中使用属性的选项?

Visual Studio 2017 和新的 .csproj InternalsVisibleTo

Visual Studio 2010 C# 调试器不会在新断点处停止

Visual Studio 高级程序在 Visual Studio Express 中打开?

Visual Studio 和 Visual Studio Express 有啥区别?

Visual Studio Express 2013 和 Visual Studio 2013 之间的区别