gpt4 book ai didi

c++ - 如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅是 DLL 文件)

转载 作者:太空狗 更新时间:2023-10-29 23:47:21 25 4
gpt4 key购买 nike

我想问一下如何从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) 我已经创建了一个新的应用程序 visual C++ 并选择了“win32 console application”

3) 我已经编写了调用 DLL 和函数的代码(如您在上面所见)

我是否遗漏了步骤或代码中的任何内容,因为我可以调用 VB.NET DLL 文件但无法调用 VB.NET DLL 函数

如您所见,我已经编写了 GETLASTERRIR() 来查找错误

cout << GetLastError() << endl;

但是我在函数失败时发现了这个错误 127,在调用 DLL 文件中发现了错误 203

谁能帮帮我

非常感谢

问候

最佳答案

由于您的 vb 程序集需要与“ native ”可执行文件完全不同的运行时,因此您需要在两者之间使用一些层。该层可能是 COM。

您可以通过其“ComVisible”属性将程序集公开给 COM 子系统。然后,您应该注册程序集以将其公开给 COM“订阅者”。

只有这样,您才能从您的 C++ 代码中#import 程序集命名空间。

注意:这是一篇非常的 msdn 文章“How to call a managed DLL from native Visual C++ code”的简短版本

编辑——刚刚试了一下……它似乎工作正常:

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();

关于c++ - 如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅是 DLL 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5991705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com