2012-05-18 61 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