Как вызвать C ++ DLL из VB6, не заходя через COM? - PullRequest
1 голос
/ 02 октября 2010

ОК, поэтому у меня есть проект C ++, который компилируется в файл DLL.Я могу ссылаться на этот файл в C # и видеть / использовать все объекты и функции в файле DLL.Что мне нужно сделать, так это ссылаться на эти объекты и функции через VB6.

В коде C ++ нет ничего похожего на создание DLL.Модификаторов __declspec (dllexport) нет, только код C ++.

Существуют такие объекты:

String ^
Array^

Я не совсем уверен, что они есть.Мои знания C ++ не очень обширны, и я только кодировал C ++ для систем Linux, хотя от их использования они выглядят как указатели.Имеют ли эти объекты какое-либо отношение к DLL в C ++?

В любом случае, я могу добавить любые нужные мне обертки или добавить файл определения (.def), хотя я не знаю, какие обертки использовать, и яне знаю, как работает файл определения или как его нужно создать.

Любая помощь и / или предложения приветствуются.Если вы можете отослать меня к хорошей информации, это было бы полезно.Весь поиск, который я сделал, не помог.

Помните, мне нужно получить доступ ко всем функциям и объектам в этой C ++ DLL из VB6.

Спасибо.

РЕДАКТИРОВАТЬ: Добавлен файл .h и спецификация AssemblyInfo.cpp к вопросу

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

//myDBObject.h
#pragma once
using namespace System;
namespace myDBNamespace {

#include "ProblemSolution.h"

public ref class MyDataBaseAccessor
{
public:
    MyDataBaseAccessor();

    static  String ^    GetServiceVersion() { return sDLLVersion;};
    int                   GetServiceStatus() { return myiDBStatus;};
    String ^                GetMyVersion();
    String ^                GetDBVersion();
    String ^                GetDLLVersion();
    String ^                GetExpireDate();

    MyOtherObject ^         GetMyOtherObject();

    int             ProcessProblem(ProblemSolution ^ dsps);

private:
    static  MyDataBaseController ^  myDataBase;
    static  MyOtherObject ^         myObjs;
    static  MyDataset ^     myDS;
    static  String ^                myDBPath;

    static  String ^                sDLLVersion = "0.01";
    static  String ^                sReqDBVer = "0.01";
    static  int                     myiDBStatus;
    static  bool                    myBoolean, myOtherBoolean, mybNoChain;

};
}

Вот файл AssemblyInfo.cpp:

#include "stdafx.h"

using namespace System;
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;
using namespace System::Security::Permissions;

//
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
//
[assembly:AssemblyTitleAttribute("My Product Title")];
[assembly:AssemblyDescriptionAttribute("")];
[assembly:AssemblyConfigurationAttribute("")];
[assembly:AssemblyCompanyAttribute("My Company")];
[assembly:AssemblyProductAttribute("My Product Name")];
[assembly:AssemblyCopyrightAttribute("My Copyright")];
[assembly:AssemblyTrademarkAttribute("My Program")];
[assembly:AssemblyCultureAttribute("")];

//
// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the value or you can default the Revision and Build Numbers
// by using the '*' as shown below:

[assembly:AssemblyVersionAttribute("1.0.*")];

[assembly:ComVisible(true)]; //Here is the ComVisible tag. It was false and I set it to true

[assembly:CLSCompliantAttribute(true)];

[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = false)];

Ответы [ 2 ]

2 голосов
/ 02 октября 2010

Я не совсем уверен, что это такое.

Вы смотрите не на код C ++, а на код C ++ / CLI, язык, предназначенный для управляемой платформы .NET.Вот почему вы можете легко использовать эту DLL в C #.

Честно говоря, если вы хотите использовать управляемые объекты в Visual Basic 6, COM Interop - ваш лучший выбор.Либо создайте оболочку, либо напрямую открывайте объекты, содержащиеся в DLL, через COM-взаимодействие.

Редактировать:

По сути, вы выставляете объекты с помощью атрибутов, т.е.вводит исходный код с атрибутами.Они описаны здесь: System.Runtime.InteropServices

Взгляните на: Введение в COM Interop

Кроме того, библию COM Interop ""Это книга Адама Натана: .NET и COM: Полное руководство по взаимодействию

Также есть статья о том, как представить объект COM и использовать его в VB6: http://www.15seconds.com/issue/040721.htm

1 голос
/ 02 октября 2010

Используйте regasm , чтобы создать файл библиотеки типов COM (.TLB) из сборки C ++ / CLI.

Теперь вы сможете ссылаться на код C ++ / CLI, ссылаясь на файл TLB в вашем коде VB6. Из примера есть:

В простейшем виде вы можете сделать:

REGASM MyAssembly.dll

Теперь все COM-совместимые классы зарегистрированы как COM-объекты. Вы можете запустить VB6 и начните писать код:

Dim net As Object

Set obj = CreateObject("NETProject.Foo")
obj.Move

Довольно просто. За исключением того, что вы опоздали привязка, потому что у вас нет COM библиотека типов.

Нет проблем! REGASM может генерировать тип Библиотека для вас и даже зарегистрировать ее:

REGASM MyAssembly.dll /tlb:MyAssembly.tlb

Теперь в VB6 вы можете добавить ссылку на библиотека типов и использовать рано связывание:

Dim net As Foo

Set obj = New NETProject.Foo
obj.Move

EDIT: Сделайте класс COM видимым так:

[ComVisible(true)]
public ref class MyDataBaseAccessor
...