چگونه نوع مقدار بازگشتي تابع رو stdcall قرار بدم؟

roebuck

Member
سلام و خسته نباشيد
سال نو مبارك..

من با c# يك class library براي ساخت dll ساختم .

حالا ميخوام نوع مقدار بازگشتي تابع رو stdcall قرار بدم..

چطور بايد اينكار رو انجام بدم؟

__stdcall‌ رو بايد بعد از نوع تابع بنويسم؟
از چه Using اي بايد استفاده كنم؟

ممنون ميشم سريعتر راهنماييم كنيد
 

MDP

Well-Known Member
این نوعی که میگید چی هست؟

اگر نوع خاصیه یک کلاس با این اسم بسازید و نوع خروجی رو از اون تعیین کنید !
 

the_king

مدیرکل انجمن
سلام و خسته نباشيد
سال نو مبارك..

من با c# يك class library براي ساخت dll ساختم .

حالا ميخوام نوع مقدار بازگشتي تابع رو stdcall قرار بدم..

چطور بايد اينكار رو انجام بدم؟

__stdcall‌ رو بايد بعد از نوع تابع بنويسم؟
از چه Using اي بايد استفاده كنم؟

ممنون ميشم سريعتر راهنماييم كنيد

زبان های Net. با ماشین مجازی شان اجرا می شوند، DLL ای که می سازند هم مشابه DLL های معمولی
که خروجی شان کد ماشین حقیقی است نیستند و اصولا فقط توسط زبان های Net. قابل استفاده اند. متد های
stdcall و cdecl و thiscall برای ارتباط برقرار کردن با توابعی است که از پشته و رجیستر های واقعی پردازنده
استفاده می کنند، ماشین مجازی همچین حالتی ندارد. در ماشین حقیقی مجبور بودن که برای ارتباط برقرار کردن
با توابع یک متد ابداع کنند، چون تابع از نظر پردازنده حقیقی مفهوم خاصی ندارد. طبیعتا پشته و رجیستر ها هم
دم دستی ترین امکاناتی بود که داشتند. اما در ماشین مجازی تابع یک مفهوم از پیش تعریف شده است و برای
ارسال کردن پارامتر و دریافت خروجی نیاز به ابداع کردن یک شیوه خاص نیست.

به همین جهت درون کد ماشین مجازی شیوه ارسال پارامتر ها و دریافت خروجی از توابع مشخص نمی شود
و ارتباطی هم با stdcall و غیره ندارد.

اگر می خواهید با #C کتابخانه ای بسازید که مثلا در Visual C++ 6.0 یا Visual Basic 6.0 قابل استفاده باشد،
اولا که همچین کاری توصیه نمی شود و در ثانی باید یک Wrapper بسازید که بین دو ساختار مستقلی که
توابع در محیط مجازی Net. و محیط حقیقی Native دارند واسطه شود.

به این لینک مراجعه کنید، مثال مناسبی است :
Exporting .NET DLLs with Visual Studio 2005 to be Consumed by Native Applications
 
  • Like
Reactions: MDP

roebuck

Member
ممنون از توضيحات دقيق شما.

از اين dll ميخوام در نرم افزار ديگه اي استفاده كنم(متاتريدر).
كه مثال شما (لينك اي كه فرستاديد) دقيقا به همين منظور هست.اما مثل اينكه يه جايي بايد كدم رو از C# به C++ تبديل كنم كه كمي پيچيده هست برام.
 

roebuck

Member
براي تبديل اين كد از C# به C++ مشكل دارم:

کد:
public string Encrypt(string plainText)
            {

                byte[] initVectorBytes = Encoding.ASCII.GetBytes("laksjdhfgmznxsdf");
                byte[] saltValueBytes = Encoding.ASCII.GetBytes("pass1");
                byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
                PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                                "pass2",
                                                                saltValueBytes,
                                                                "SHA1",
                                                                2);

                byte[] keyBytes = password.GetBytes(256 / 8);
                RijndaelManaged symmetricKey = new RijndaelManaged();
                symmetricKey.Mode = CipherMode.CBC;
                ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                                 keyBytes,
                                                                 initVectorBytes);
                MemoryStream memoryStream = new MemoryStream();
                CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                             encryptor,
                                                             CryptoStreamMode.Write);
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                cryptoStream.FlushFinalBlock();
                byte[] cipherTextBytes = memoryStream.ToArray();
                memoryStream.Close();
                cryptoStream.Close();
                string cipherText = Convert.ToBase64String(cipherTextBytes);
                return cipherText;
            }

با converter (دانلود كردم) كه تبديل ميكنم كلي خطا داره.
ممكنه راهنماييم كنيد؟
 

roebuck

Member
اين خط كد كه به زبان c# هست را ميتونيد به c++‌تبديل كنيد؟

کد:
byte[] initVectorBytes = Encoding.ASCII.GetBytes("laksjdhfgmznxbcv");
 

جدیدترین ارسال ها

بالا