2012-04-10 6 views
5

को C++ dll लौटे मैं इस C++हैंडलिंग सरणी सी #

extern "C" __declspec(dllexport) 
    char* __stdcall hh() 
{ 
    char a[2]; 
    a[0]='a'; 
     a[1]='b'; 
    return(a); 
} 

में बनाया मेरी dll और में यह कैसे मैं सी # में कोड को संभालने के लिए

[DllImport(@"mydll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]  
     public static extern IntPtr hh(); 
     static void Main(string[] args) 
     { 
      IntPtr a = hh(); 
      //How to proceed here??? 
     } 


    } 

कार्यवाही में मदद कोशिश कर रहा हूँ है आगे की।

+0

आपका प्रश्न वास्तव में क्या है? –

+0

मैं C++ कोड से C++ कोड से सरणी returend मुद्रित करना चाहता हूँ C# – pushE

उत्तर

-2

रिक्त मूल्य के रूप में खाली स्ट्रिंगबिल्डर को उपयोग करने का प्रयास करने का प्रयास करें।

1

जवाब

string stra = Marshal.PtrToStringAnsi(a); 

होगा लेकिन क्या आप भी समस्या यह है कि dll चार * के रूप में अपने कोड के अनुसार कचरा रिटर्न एक स्थानीय ग शैली स्ट्रिंग है। ठीक नहीं होगा अगर आप की तरह कुछ वापसी होगी:

const char* str = "Hello from DLL."; 
+0

मैं तारों की सरणी को एक स्ट्रिंग – pushE

+0

ठीक नहीं करना चाहता हूं। थोड़ा सा गलत समझा। उम्मीद वैसे भी मदद करता है। – ervinbosenbacher

3

कोई रास्ता नहीं इस तरह के सरणियों को संभालने के लिए नहीं है। char a[2] आपके सी ++ फ़ंक्शन में स्टैक पर आवंटित किया गया है और जैसे ही आप इसे वापस लौटते हैं, नष्ट हो जाता है। आपको या तो सी # से एक सरणी पास करनी चाहिए और उसे सी ++ कोड में भरना चाहिए या ढेर में सरणी आवंटित करना चाहिए और उसे मुक्त करने के कुछ साधन प्रदान करना चाहिए।

जब आपके पास यह सही है तो हैंडलिंग इस बात पर निर्भर करेगी कि आप सी ++ कोड से डेटा कैसे वापस कर सकते हैं। यदि यह अभी भी IntPtr है तो आप मार्शल का उपयोग कर सकते हैं। रीडबेट विधियों को स्मृति से वर्ण पढ़ने के लिए और यदि आवश्यक हो तो उन बाइट्स को स्ट्रिंग में परिवर्तित करने के लिए एन्कोडिंग विधियों का उपयोग करें।

 

const int bufferSize = 2; // suppose it's some well-known value. 
IntPtr p = ...; // get this pointer somehow. 
for (var i = 0; i != bufferSize; ++i) 
{ 
    var b = Marshal.ReadByte(p, i); 
    Console.WriteLine(b); 
} 
 
2

मैं इस प्रकार है :: के रूप में

extern "C" __declspec(dllexport) 
    char** __stdcall hh() 
{ 
static char* myArray[3] = {"A1", "BB2", "CC3",}; 
    return myArray; 
} 

इस प्रकार है और सी # के रूप में अब

[DllImport(@"ourdll.dll",CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]  
     public static extern IntPtr hh(); 
     static void Main(string[] args) 
     { 
      IntPtr a = hh(); 
      int j = 0; 
      string[] s=new string[100]; 
      do 
      { 
       s[j] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(a,4*j)); 
       j++; 
      } 
      while(s[j-1] != null); 
     } 

केवल समस्या इस प्रकार चला जाता है

हमारे सी ++ कोड चला जाता है एक समाधान मिल गया सामना करना यह है कि हम सरणीके आकार को कैसे जान सकते हैंताकि इस कथन में स्ट्रिंग [] एस = नई स्ट्रिंग [100]; हमें हमारी याददाश्त बर्बाद करने की आवश्यकता नहीं है।

संबंधित मुद्दे