سؤال

لدي بعض التعليمات البرمجية C# الدعوة إلى غير مدارة C++ DLL.طريقة أنا أتصل يهدف إلى قبول سلسلة بمثابة المرجع.للتعامل مع هذا لا تمر في بـ stringbuilder, وإلا فسيكون هناك StackOverflowException.

هذا يعمل بشكل جيد, ولكن في بعض المكالمات السلسلة التي يعود من التعليمات البرمجية غير المدارة هي مختلطة سلسلة مثل هذا:øŸE.,Ê.أعرف أن هذا يجب أن يكون أن تفعل شيئا مع ترميز, ولكن لقد حاولت العديد من الأمور المدرجة أدناه و لا شيء يعمل.هذه ليست قضية في VB.Net رمز أن شخصا آخر قد كتب أن تفعل شيئا من هذا القبيل.

هذا ما حاولت:1.أنا باستخدام هذا:[DllImport("dmphnx32.dll")] ، ولكن قد حاولت كل محارف خيارات من دون نجاح.

  1. حاول استخدام الترميز.الافتراضي.GetBytes, ترميز.ASCII, ترميز.Unicode ، والباقي دون نجاح.

ليس لدي أي خبرة مع C++ لذلك أنا حقا يمكن استخدام المساعدة.

هنا DLLIMport الطريقة:

[DllImport("dmphnx32.dll")]
        public static extern int PhxQueryDataAttributes(int handle,
                                        StringBuilder lTableName,
                                        StringBuilder lColumnName,
                                        ref short lIteration,
                                        ref short type,
                                        ref short maxLen,
                                        ref short endorsement,
                                        StringBuilder endorsementId);

هنا هو رمز C++:

short DMEXP PhxQueryDataAttributes(HWND handle,
                                   char *lTableName,
                                   char *lColumnName,
                                   short *lIteration,
                                   short *Type,
                                   short *MaxLen,
                                   short *Endorsement,
                                   char  *EndorsementID)
{

    handle = PhxInfo.HiddenHwnd;
    strcpy(lTableName, PhxInfo.TableName);
    strcpy(lColumnName, PhxInfo.ColumnName);


    *Type = PhxInfo.PhnxDataType;
    // max len
    *MaxLen = PhxInfo.MaxDataLen;
    *Endorsement = PhxInfo.Endorsement;
    strcpy(EndorsementID, PhxInfo.EndorsementID);
    // determine which table we need the iteration of
    *lIteration = PhxIterationArray[PhxInfo.sEffectiveTableID];

    return SUCCESS;
}

هنا هي C# رمز المكالمات في التعليمات البرمجية غير المدارة:

public int PhxQueryDataAttributes(int handle, ref string lTableName, ref string lColumnName, 
            ref short lIteration, ref short type, ref short maxLen, ref short endorsement, 
            ref string endorsementId)
        {
            var sbTableName = new StringBuilder();
            var sbColName = new StringBuilder();
            var sbEndId = new StringBuilder();

            var ret = RatingProxy.PhxQueryDataAttributes(handle, sbTableName, sbColName,
            ref lIteration, ref type, ref maxLen, ref endorsement, sbEndId);


            lTableName = sbTableName.ToString();
            lColumnName = sbColName.ToString();
            endorsementId = sbEndId.ToString();
return ret;
}

شكرا كوري

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

المحلول 3

بعد أن حاولت الأول 2 إجابات و علمت أنها لم تكن مساعدة ، كنت أعرف أن هناك شيئا آخر يجب أن يكون المشتبه فيه.وجدت الشوائب الصغيرة في مكان آخر في التطبيق حيث كنت في عداد المفقودين في الواقع تهيئة المعلمة على التعليمات البرمجية غير المدارة.هذا كان يسبب لي بغرابة ترميز السلسلة.

شكرا للمساعدة ، كوري

نصائح أخرى

حسنا, أرى المشكلة الخاصة بك.كنت بحاجة إلى تخصيص القدرة على StringBuilder, لا يمكنك فقط استخدام الافتراضي.

بدلا من بـ stringbuilder ، قد حاولت استخدام IntPtr و المشير الدرجة.

حتى, انها تبدو مثل هذا:

[DllImport("dmphnx32.dll")]
    public static extern int PhxQueryDataAttributes(int handle,
                                    IntPtr lTableName,
                                    IntPtr  lColumnName,
                                    ref short lIteration,
                                    ref short type,
                                    ref short maxLen,
                                    ref short endorsement,
                                    IntPtr endorsementId);

كود الاتصال ليكون:

public int PhxQueryDataAttributes(int handle, ref string lTableName, ref string lColumnName, 
        ref short lIteration, ref short type, ref short maxLen, ref short endorsement, 
        ref string endorsementId)
    {
        var sbTableName = Marshal.AllocHGlobal(1024);//Change these to the max length possible for each string.
        var sbColName = Marshal.AllocHGlobal(1024);
        var sbEndId = = Marshal.AllocHGlobal(1024);

        var ret = RatingProxy.PhxQueryDataAttributes(handle, sbTableName, sbColName,
        ref lIteration, ref type, ref maxLen, ref endorsement, sbEndId);


        lTableName = Marshal.PtrToStringAnsi(sbTableName);
        lColumnName = Marshal.PtrToStringAnsi(sbColName);
        endorsementId = Marshal.PtrToStringAnsi(sbEndId);
        return ret;
}

بهذه الطريقة يمكنك تحديد الترميز الصحيح (الذي لا يمكنك أن تفعل مع سلسلة البناء, الذي يفترض أنه هو UTF نوع ترميز).التجربة قليلا ، والتي ترى من المشير.PtrToString...منها العمل ، على الرغم من ANSI يجب أن تعمل, لأن ذلك هو ما معظم C++ استخدام المكتبات.

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