ورود

View Full Version : نحوه ارسال string از دلفی به C++



JalaliMehr
چهارشنبه 12 آبان 1389, 15:08 عصر
سلام.
من یه String[255] رو به یک dll که در vc++ نوشتم ارسال می کنم آرگومان این رشته رو Char* گرفتم ولی نمی دونم چرا رشته رو vc++ چاپ می کنم آخرش رشته یه سری کاراکتر های اضافی نشون میده و برای همین مجبور شدم طول رشته رو هم بفرستم .
اگر نخام طول رشته رو بعنوان پارامتر بفرستم چیکار بایستی انجام بدم تا این رشته درست انتقال داده بشه.

mehdi.mousavi
چهارشنبه 12 آبان 1389, 18:58 عصر
سلام. من یه String[255] رو به یک dll که در vC++‎ نوشتم ارسال می کنم آرگومان این رشته رو Char* گرفتم ولی نمی دونم چرا رشته رو vC++‎ چاپ می کنم آخرش رشته یه سری کاراکتر های اضافی نشون میده و برای همین مجبور شدم طول رشته رو هم بفرستم . اگر نخام طول رشته رو بعنوان پارامتر بفرستم چیکار بایستی انجام بدم تا این رشته درست انتقال داده بشه.

سلام.
من از Delphi چیزی نمیدونم، اما در C/C++ انتهای رشته خودتون رو (برای جلوگیری از ایراد پیش اومده) باید NULL یا همون صفر بذارید و الا قادر نخواهید بود تا انتهای اون رو تعیین کنید. قاعدتا در Delphi نیز امکانی برای ایجاد Null Terminated String ها وجود داره، که اگر در تالار مربوطه مطرح کنید، بهتون پاسخ خواهند داد.

موفق باشید.

پاورقی: در برخی مواقع، (بخصوص در COM/COM+) نیاز هستش که از BSTR استفاده بشه. BSTR طول رشته رو در اولین خونه حافظه قبل از شروع شدن رشته نگه میداره، در نتیجه، چنین مشکلاتی پیش نمیاد. اما من چون از جزییات کار شما آگاه نیستم، نمیتونم توصیه ای در این مورد کنم. فقط گفتم که حواستون جمع باشه، شاید نیاز داشته باشید که از BSTR استفاده کنید.

vcldeveloper
چهارشنبه 12 آبان 1389, 20:27 عصر
اینو باید در تالار دلفی می پرسیدید، نه اینجا.

در دلفی نوع داده string به طور خودکار null-terminated هست، و نیازی نیست برنامه نویس خودش کارکتر آخر رو null کنه. البته دلفی به این کارکتر null نیاز نداره، چون طول رشته را در خانه صفر از رشته نگهداری میکنه، اما این کارکتر رو برای حفظ سازگاری با C به انتهای رشته اضافه میکنه.

اما تعریف string محدود شده به صورت string[255] فقط مختص ShortString هست، و نوع داده string دلفی محدودیت اندازه به این شکل نداره. پس در اینجا شما از نوع داده ShortString استفاده کردید که یک نوع داده قدیمی مربوط به Turbo Pascal هست، و در دلفی فقط برای حفظ سازگاری با نسخه های گذشته وجود داره.

اگر میخواید از همون نوع داده فعلی استفاده کنید، باید همانطور که آقای موسوی گفتند، خودتون در انتهای رشته کارکتر null (یعنی 0#) اضافه کنید.
اگر میخواید از نوع داده string دلفی استفاده کنید، آن را به PChar تبدیل نوع (type-cast) کنید. PChar در واقع معادل Char* در ++C هست، و نوع داده string دلفی کاملا با PChar سازگاری نوع داره، و می تونید یک مقدار string رو به یک متغیر یا پارامتر PChar اختصاص بدید.

JalaliMehr
پنج شنبه 13 آبان 1389, 09:10 صبح
من تو دلفی 7 با pchar مشکلی نبود و اینکار انجام شد ولی تو دلفی 2010 نوع pchar به صورت پیش فرض معادل pwidechar و هر کاری کردم درست ارسال نشد.
برای رفع این مسئله بایستی چکار انجام بدم.

vcldeveloper
پنج شنبه 13 آبان 1389, 09:15 صبح
من تو دلفی 7 با pchar مشکلی نبود و اینکار انجام شد ولی تو دلفی 2010 نوع pchar به صورت پیش فرض معادل pwidechar و هر کاری کردم درست ارسال نشد.
برای رفع این مسئله بایستی چکار انجام بدم.
دلفی 7 به طور پیش فرض از ANSI استفاده می کرد، اما دلفی 2009 و نسخه های بعد از آن، به طور پیش فرض از یونیکد استفاده می کنند. برای همین هم PChar معادل PWideChar شده. شما اگر نمی خواید به هر دلیلی از یونیکد استفاده کنید، به جای string از AnsiString و به جای PChar از PAnsiChar استفاده کنید.

مصطفی ساتکی
جمعه 14 آبان 1389, 11:37 صبح
در ادامه گفته های جناب کشاورز در دلفی 2010 یه متغیر از نوع pansichar تعریف کنید و سپس با getmem به اندازه طول رشته بعلاوه یک براش فضا بگیرین سپس با strpcpy رشته خودتونو تو این متغیر pansichar کپی کنید و خانه آخر رو هم #0 صفر قرار دهید.حالا این متغیر pansichar رو ارسال کنید.