использование устаревшей (VB6) DLL в новом проекте Visual Studio Express (C++ prefrred)

У меня есть старое устаревшее приложение для связи через последовательный порт с коммуникационной шиной встроенного контроллера. который разработал кто-то другой.

Приложение написано на VB6 и структурировано как два проекта: DLL для обработки логики подключения и связи и проект графического пользовательского интерфейса приложения.

Я надеялся, что смогу написать новый графический интерфейс приложения (в идеале на C++), чтобы использовать существующую DLL как есть, но у меня много проблем с тем, как ее импортировать.

Поэтому мне интересно, можно ли вообще использовать эту старую DLL в проекте C++ как есть? или можно импортировать в проект С#? или проект VB.NET? (предпочел бы не использовать VB, но могу, если придется)

Где я сейчас:

У меня есть скомпилированный исполняемый файл и DLL, и они работают в моей системе.

У меня также есть файлы проекта, и все они читаются в notepad++, но у меня нет VB6, и импортировать проект в визуальную студию VB.NET 2008 Express совсем не просто. Особенно без рабочего примера, который можно сначала изучить и поиграть (проект DLL может быть импортируемым, но в отчете об обновлении указано более 50 вещей, требующих изменения. Он также, похоже, игнорирует три файла .cls, которые кажутся мне очень важными) не особенно подкованные в VB6 глаза ... В проекте приложения есть сообщение в отчете об обновлении о чем-то "отсутствует лицензия на время разработки", и единственные файлы проекта, которые действительно попадают в проводник проекта для импортированного проекта, - это сам файл проекта и файл информации о сборке.)

В большинстве примеров того, как импортировать DLL в VS C++, предполагается, что у вас есть решение с проектом DLL, которое хорошо компилируется вместе с вашим проектом, который будет его использовать. Или хотя бы файл .DLL и .lib и .h... Я поговорил с первоначальным разработчиком кода (в другом городе, напрямую не работаем) и получил .lib, соответствующий моей .dll, но все же нет файла .h.

Обычно я могу врубиться в что-то новое, но без базового рабочего примера проекта даже в VB6, из которого я могу понять, это очень усложняет. Кроме того, отсутствие подобных вопросов в любом месте, где Google может найти их в сети, заставляет меня задаться вопросом, стоит ли мне вообще пытаться это сделать.

Я работаю над получением неэкспресс-копии Visual Studio, если это будет иметь какое-либо значение (экспресс работал нормально для всего до сих пор, поэтому мне больше ничего не нужно), но это, скорее всего, займет несколько недель.

Любые предложения будут очень признательны.

Спасибо за чтение!


person Julian Higginson    schedule 21.05.2012    source источник


Ответы (1)


Я должен отказаться от этого, поскольку у меня нет опыта в этом, но я просто обнаружил, что это должно быть возможно, если прочитать документацию по этому вопросу.

Я не уверен, что вам повезет с процессом импорта/преобразования VB в .NET, если происходит много низкоуровневых вещей. Существующая dll, скорее всего, является COM-объектом, нет?

Похоже, что есть некоторая документация MSDN, которая поможет вам начать работу с C ++ с использованием dll COM-объектов, и похоже, что директива #import также будет генерировать некоторые файлы .h (заголовок).

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

Поэтому я бы попробовал просто добавить для него директиву #import.

#import "somelibrary.dll"

и посмотреть, что генерирует визуальная студия.

Взгляните также на следующий пример (бессовестно скопированный с другого форума)

 #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);
   }
 }
person dwerner    schedule 21.05.2012
comment
спасибо, что нашли время ответить! К сожалению, у меня не было другого шанса взглянуть на проблему какое-то время, я попробую предложение, когда у меня будет шанс! - person Julian Higginson; 07.09.2012