我想问一下如何从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&lt;&lt; GetLastError()&lt;&lt; ENDL;
但是我发现失败时函数中的错误127和调用DLL文件中的203
任何人都可以帮助我
非常感谢
此致
答案 0 :(得分:5)
由于你的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();
答案 1 :(得分:2)
"Class1::example_function1"
可能是有效标识符的dll。通常它只与extern "C"
(或在没有++的C中实现)函数一起使用,这些函数不会被破坏。答案 2 :(得分:1)
您无法直接从本机C ++访问.NET代码,您将需要C ++ / CLI。
如果您的程序需要是本机C ++,则可以编写混合模式包装DLL,为主程序提供本机C ++接口,并在实现中使用C ++ / CLI将调用转发到.NET DLL。
答案 3 :(得分:1)
您需要在C ++ / CLI上编写一个包装器。您可能会发现以下链接很有帮助。 http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx