2012-05-18 63 views
2

所以我有一个用C++编写的DLL,我在C#中使用它。问题是我在C++中使用函数指针,所以我做了一个委托。该漏洞程序的作品,但完成后,我得到一个消息框,说明ESP的价值没有保存的功能。从C#调用C++ DLL ESP值

我的代码: C++的DLL

typedef void (*FUNCTION_TYPE)(bool); 
extern "C" 
{ 
    DLL void prim(int a, FUNCTION_TYPE myF) 
    { 
     if(a < 2) 
     { 
      myF(false); 
      return; 
     } 

     for (int i = 2; i < a; i++) 
     { 
      if (a % i == 0) 
      { 
       myF(false); 
       return; 
      } 
     } 

     myF(true); 
    } 
}; 

我的C#代码(调用DLL):

delegate void SOME_FUNCTION(bool isFine); 

     [DllImport("DLLs")] 
     private static extern void prim(int n, SOME_FUNCTION afisare); 

     static void afisare(bool isFine) 
     { 
      if (isFine == true) 
       Console.WriteLine("Da, e prim"); 
      else 
       Console.WriteLine("Nu, nu e prim"); 
     } 

     static void Main(string[] args) 
     { 
      SOME_FUNCTION myAfis = afisare; 
      prim(17, myAfis); 
     } 

回答

2

你有一个调用约定不匹配。 C++函数指针类型使用cdecl。托管代码假定为stdcall。解决这个问题是这样的:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
delegate void SOME_FUNCTION(bool isFine); 

另外,您可以在C++代码改变调用约定来stdcall

typedef void (__stdcall *FUNCTION_TYPE)(bool); 

但要确保你只能做其中的一个,而不是两个!

+0

非常感谢!当我被允许时,我会接受你的答案:D – Thanatos