2011-05-13 55 views
2

我想请教一下如何从C调用DLL VB.NET ++程序如何从C调用DLL VB.NET ++(呼叫功能也 - 不只是DLL文件)

我已经尝试了很多次调用问题VB.NET DLL文件从C + +和它工作正常,但问题是我不能调用VB.NET DLL文件的功能(我只能加载VB.NET DLL文件)

in 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)I已经创建了一个新的应用程序Visual C++和

3)I所编写的代码来调用DLL和功能(如你可以在上面看到)

选择“Win32控制台应用程序”

我错过了在步骤或代码,任何东西,因为我可以调用VB.NET DLL文件,但我不能调用VB.NET的DLL函数

,你可以看到我写的GETLASTERRIR()来找到错误

cout < < GetLastError()< < endl;

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

谁能帮助我

非常感谢您

问候

+2

错误127名的意思是“指定的程序无法找到”。 VB.NET不能导出这样的函数。您将需要使用COM(使用属性)或使用C++/CLI语言编写包装类。需要此粘合剂才能使CLR初始化,以便您的程序可以执行托管代码。 – 2011-05-13 12:47:18

回答

2
  • GetProcAddress的呢不明白C++的名字mangling,更不用说其他的mangling,所以没有哪个dll可以作为"Class1::example_function1"的有效标识符。通常它只能与extern "C"(或用C++ ++实现)函数一起使用,这些函数不会被破坏。
  • 如果它在VB.NET中实现,它根本不是一个DLL,所有。这是一个.net程序集,您需要在CLR(.net运行时)中运行才能使用它。您可以在CLR中运行C++代码,但它必须是“Managed C++”,它被扩展为具有.net对象引用和使用垃圾回收器操作的特殊类型。
+0

您引用了与该主题相关的事实,并且尽管您说的所有内容都是真实的,但它并不回答这个问题。 – 2011-05-13 14:40:52

+0

非常感谢您的回放。我已经尝试过CLR应用程序和vb.net DLL的Load现在它的工作perfeclty,这意味着没有错误,但在调用该函数也存在问题。同样的问题GeLAst错误是127.我如何在我的C++代码中使用extern“C”? Registers – 2011-05-13 18:20:54

1

您无法直接从本机C++访问.NET代码,因此您需要使用C++/CLI。

如果您的程序需要本机C++,则可以编写混合模式包装程序DLL,它为主程序提供本地C++接口,并在实现中使用C++/CLI将调用转发给该程序。 NET DLL。

5

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

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

只有那么你可以#import程序集命名空间从你的c + +代码。

注:这是一个MSDN文章的非常简略版 “How to call a managed DLL from native Visual C++ code

EDIT--就尝试过了......,它似乎还好吧工作:

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

感谢您的回复。总之我应该有tlb文件吗?因为我只有DLL文件。 – 2011-05-13 18:18:12

+1

@Hadi Al-Zaabi:你真的应该阅读这篇文章。 'RegAsm'是您用来从程序集创建.tlb文件的工具。 – xtofl 2011-05-13 20:36:09