Как вызвать VB.NET DLL из C ++ (также вызывать функции - не только DLL-файл) - PullRequest
2 голосов
/ 13 мая 2011

Я хочу задать вопрос о том, как вызвать VB.NET DLL из C ++ программы

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

в DLL VB.NET У меня есть следующий код:

Public Function example_function1(ByVal i As Integer) As Integer
    Return 3

End Function

Public Function example_function2(ByVal i As Integer) As Integer
    Return 3
End Function

==================================

Мой код C ++:

    typedef int (__stdcall *ptf_test_func_1_type)(int); 
typedef int (__stdcall *ptf_test_func_2_type)(int*); 
int i =1;

HINSTANCE dll_instance = LoadLibrary("DLLs7.dll");

int main()
{

    if(dll_instance !=NULL)
        {
            printf("The DLLs file has been Loaded \n");
            cout << GetLastError() << endl;

            ptf_test_func_1_type p_func1=(ptf_test_func_1_type)GetProcAddress(dll_instance,"Class1::example_function1");
            ptf_test_func_2_type p_func2=(ptf_test_func_2_type)GetProcAddress(dll_instance,"Class1::example_function2");


            // Function No 1 //

                        if (p_func1 != NULL)
                                 {
                                     cout << "\nThe function number 1 is " << p_func1(i) << endl;

                                }

                        else
                                {
                                    cout << "\nFailed" << endl;
                                    cout << GetLastError() << endl;
                                }

            // Function No 2 //

                        if (p_func2 != NULL)
                                 {
                                     cout << "\nThe function number 2 is" << p_func2(&i) << endl;

                                }

                        else
                                {
                                    cout << "\nFailed" << endl;
                                    cout << GetLastError() << endl;
                                }

        }   
    else
        {
            printf("\nDLLs file Load Error");
            cout << GetLastError() << endl;
        }

        cout << GetLastError() << endl;

    return(0);
}

Мои следующие шаги:

1) Я создал VB.NET DLL.

2) Я создал новое приложение Visual C ++ и выбрал «win32».консольное приложение "

3) Я написал код для вызова DLL и функций (как вы можете видеть выше)

я что-то пропустил в шагах или кодепотому что я могу вызвать файл DLL VB.NET, но не могу вызвать функцию DLL VB.NET

, как вы можете видеть, я написал GETLASTERRIR (), чтобы найти ОШИБКУ

cout << GetLastError () << endl;</p>

но я обнаружил эту ошибку 127 в функции при сбое и 203 в файле DLL вызова

кто-нибудь может мне помочь

Большое спасибо

С уважением

Ответы [ 4 ]

5 голосов
/ 13 мая 2011

Поскольку вашей сборке vb требуется совершенно другое время выполнения, чем у «родного» исполняемого файла, вам нужно будет использовать некоторый промежуточный слой. Этот слой может быть COM.

Вы можете открыть свою сборку для подсистемы COM с помощью свойства ComVisible. Затем необходимо зарегистрировать сборку, чтобы предоставить ее «подписчикам» COM.

Только тогда вы можете #import пространство имен сборки из вашего кода C ++.

Примечание: это очень краткая версия статьи msdn " Как вызвать управляемую DLL из собственного кода Visual C ++ "

РЕДАКТИРОВАТЬ-- Только что попробовал ... и, кажется, работает нормально:

C # код

namespace Adder
{
    public interface IAdder
    {
        double add(double a1, double a2);
    }
    public class Adder : IAdder
    {
        public Adder() { }
        public double add(double a1, double a2) { return a1 + a2; }
    }
}

Настройки проекта

[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]

(Подписание было необходимо, чтобы иметь возможность генерировать tlb)

C ++ код:

#import <adder.tlb> raw_interfaces_only

  CoInitialize(NULL);
  Adder::IAdderPtr a;
  a.CreateInstance( __uuidof( Adder::Adder ) );
  double d = 0;
  a->add(1.,1., &d); 
  // note: the method will return a HRESULT; 
  // the output is stored in a reference variable.
  CoUninitialize();
2 голосов
/ 13 мая 2011
  • GetProcAddress не понимает искажение имени в C ++, не говоря уже о любом другом искажении, поэтому нет dll, для которого "Class1::example_function1" мог бы быть допустимым идентификатором. Обычно он используется только с функциями extern "C" (или реализованными в C без ++), которые не искажены.
  • Если это реализовано в VB.NET, это вообще не dll . Это сборка .net, и для ее использования вам нужно работать в среде CLR (.net runtime). Вы можете запустить код C ++ в CLR, но это должен быть «Управляемый C ++», который расширен специальными типами для ссылок на объекты .net и работы со сборщиком мусора.
1 голос
/ 13 мая 2011

Для этого вам нужно написать оболочку на C ++ / CLI.Вы можете найти следующую ссылку полезной.http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx

1 голос
/ 13 мая 2011

Вы не можете напрямую обращаться к .NET-коду из нативного C ++, для этого вам понадобится C ++ / CLI.

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

...