سؤال

وبالنظر إلى وظيفة C التالية في DLL:

char * GetDir(char* path );

وكيف P / استدعاء هذه الوظيفة إلى C # و حشد شار * صحيح. يبدو .NET لمعرفة كيفية القيام LPCTSTR ولكن عندما لا يمكن معرفة أي التنظيم الذي لا يسبب NotSupportedException لاطلاق النار عند استدعاء هذه الوظيفة.

هل كانت مفيدة؟

المحلول

والجواب OregonGhost هو الصحيح إلا إذا كان شار * عاد من GetDir إما المخصصة في HGLOBAL أو LocalAlloc. لا أستطيع أن أتذكر أي واحد ولكن سوف CLR نفترض أن أي نوع إرجاع سلسلة من وظيفة PInvoke تم تخصيص مع واحد أو آخر.

وهناك طريقة أكثر قوة هو نوع عودة GetDir أن يكون IntPtr. ثم يمكنك استخدام أي من وظائف Marshal.PtrToStringAnsi من أجل الخروج نوع السلسلة. كما أنه يتيح لك المرونة عشر من تحرير السلسلة بالطريقة التي تختارها.


[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);

هل لك أن تعطينا أي تلميحات أخرى لسلوك GetDir؟ هل تعديل سلسلة الإدخال؟ كيف يتم القيمة التي يتم إرجاعها خصصت؟ إذا كنت تستطيع توفير ذلك أستطيع أن أعطي إجابة أفضل من ذلك بكثير.

نصائح أخرى

وحاول

[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);
وتنظيمها

وسلسلة تلقائيا إلى سلسلة إنهاء الصفر، ومع الخاصية محارف، تخبر Marshaller أنه ينبغي استخدام ANSI بدلا من يونيكود. ملاحظة: استخدام سلسلة (أو System.String) لCONST شار *، ولكن ب StringBuilder لشار *

ويمكنك أيضا محاولة MarshalAs، كما هو الحال في هذا المثال .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top