2

C++ プログラムから VB.NET DLL を呼び出す方法について質問したい

C++ から VB.NET DLL ファイルを呼び出そうと何度も試みましたが、正常に動作していますが、問題は VB.NET DLL ファイルの関数を呼び出せないことです (VB.NET DLL ファイルしかロードできません)。

VB.NET DLL には、次のコードがあります。

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) 新しいアプリケーション ビジュアル C++ を作成し、「win32 コンソール アプリケーション」を選択しました。

3) DLL と関数を呼び出すコードを作成しました (上記を参照)。

VB.NET DLL ファイルを呼び出すことはできますが、VB.NET DLL 関数を呼び出すことができないため、手順またはコードで何か見逃していましたか?

ご覧のとおり、エラーを見つけるために GETLASTERRIR() を作成しました

cout << GetLastError() << endl;

しかし、失敗したときに関数でこのエラー127が見つかり、呼び出しDLLファイルで203が見つかりました

誰でも私を助けることができます

どうもありがとうございました

よろしく

4

4 に答える 4

5

vbアセンブリには、「ネイティブ」実行可能ファイルとはまったく異なるランタイムが必要なため、その間にいくつかのレイヤーを使用する必要があります。この層はCOMである可能性があります。

'ComVisible'プロパティを使用して、アセンブリをCOMサブシステムに公開できます。次に、アセンブリを登録して、COMの「サブスクライバー」に公開する必要があります。

#importそうして初めて、c++コードからアセンブリ名前空間を作成できます。

注:これは、msdnの記事「ネイティブVisualC++コードからマネージDLLを呼び出す方法」の非常に短いバージョンです。

編集-ちょうどそれを試してみました...そしてそれは大丈夫に動作するようです:

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();
于 2011-05-13T12:47:29.123 に答える
2
  • GetProcAddressは、他のマングリングは言うまでもなく、C ++の名前マングリングを理解しないため、"Class1::example_function1"有効な識別子となる可能性のあるdllはありません。通常extern "C"、これは、マングルされていない関数でのみ使用されます(または、++なしでCで実装されます)。
  • VB.NETで実装されている場合、それはdllではありません。これは.netアセンブリであり、使用するにはCLR(.netランタイム)で実行する必要があります。C ++コードはCLRで実行できますが、「マネージC ++」である必要があります。これは、.netオブジェクト参照およびガベージコレクターでの操作のための特別な型で拡張されています。
于 2011-05-13T12:39:13.847 に答える
1

ネイティブC++から.NETコードに直接アクセスすることはできません。そのためには、C ++/CLIが必要です。

プログラムをネイティブC++にする必要がある場合は、メインプログラムにネイティブC ++インターフェイスを提供し、実装でC ++/CLIを使用して呼び出しを.NETDLLに転送する混合モードラッパーDLLを作成する可能性があります。

于 2011-05-13T12:40:43.610 に答える
1

そのためにC++/CLIでラッパーを作成する必要があります。次のリンクが役立つ場合があります。http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx

于 2011-05-13T12:42:42.093 に答える