ايران ويج

نسخه‌ی کامل: string?
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام. من يه مشكل دارم. اينكه چطور ميشه از vb يه رشته رو به يه dll كه با vc++6 نوشتم(يعني دارم مي نويسم) بفرستم؟ با آرايه؟ چطور؟Confused
شما از همون string معمولی در وی بی استفاده کن و اونو به به DLL بفرست . string های وی بی از نوع ساختار خاصی با نام BSTR هستند . برای دریافت string وی بی بشکل درست و بدون مشکل در ++VC باید دو نکته رو رعایت کنید :

1- string خودتون رو حتما بصورت Byval به تابع DLL بفرستید !
2- پارامتر دریافت کننده string در تابع DLL خودتون رو از نوع LPSTR تعریف بکنید . BSTR در واقع یک ساختار دو قسمتی داره که قسمت اولش یک هدر هست و قسمت دومش یک string که انتهاش null قرار داره و دقیقا مثل همون رشته های معمولی C میمونه.
پس هدف ما اینجا دسترسی به قسمت دوم ساختار BSTR خواهد بود .
خوشبختانه متغیر های BSTR اشاره گری هستند به ابتدای همین رشته پس اگر یک متغیر BSTR رو برابر یک متغیر LPSTR قرار بدیم ، این متغیر ما دقیقا به ابتدای رشته موجود در BSTR اشاره میکنه و ما به رشته مورد نظر دسترسی پیدا میکنیم !

حالا ممکنه بپرسید که LPSTR چه نوعی هست ؟؟ در واقع این یک نوع تعریف شده در توابع ویندوز هست و دقیقا برابر *char خودمون در زبان C هست ( اشاره گری به string که انتهای اون null هست) Question

اطلاعات کامل : http://msdn.microsoft.com/en-us/library/...S.60).aspx
مرسي ممّد.
يه مشكل ديگه! چطور مي تونم LPSTR رو تو char[] كپي كنم؟
LPSTR همون طور که گفتم همون *char هست . توی ++C/C باید بدونید که میشه با اشاره گرها مثل آرایه برخورد کرد چون اسم هر آرایه ای در واقع اشاره گری به ابتدای آرایه هست پس مشخصا برای دسترسی به رشته LPSTR هیچ نیازی به کپی کردن و ایجاد یک []char نیست . مثال :
کد:
LPSTR str1 = "Hello World";
     cout << str1[2];

توجه داشته باش که هر تغییری در متغیر های LPSTR در واقع مستقیما در حافظه و روی رشته اصلی انجام میشه . اینجاست که برای جلوگیری از این کار شما میتونید یک کپی از LPSTR بگیرید و توی یک آرایه char بریزید . اینکار رو خیلی راحت با strcpy انجام میدیم :

کد:
LPSTR str1 = "Hello World";
     char  str3[20];
     strcpy(str3, str1);    
     cout << str3;
آره خوب. strcpy رو امتحان كرده بودم. ولي مشكل اينه كه هر كاراكتر LPSTR تو بيش از يك بايت ذخيره ميشه. دقيق نمي دونم ولي فكر ميكنم تو 2 بايت. حالا مشكل من اينه كه نمي تونم اونا رو به اسكي تبديل كنم.
آخه مي دوني چيه؟ من اول كدهامو براي console نوشته بودم. ولي بعدا تصميم گرفتم اونا رو تبديل به dll كنم كه بتونن با vb راحتتر ارتباط داشته باشن. همه كاراشم تموم كردم. فقط مونده اين قسمتش. ****
در ضمن ممنون كه با حوصله جواب ميدي!
نقل قول: مشكل اينه كه هر كاراكتر LPSTR تو بيش از يك بايت ذخيره ميشه. دقيق نمي دونم ولي فكر ميكنم تو 2 بايت

خیر اینطور نیست . LPSTR هر کاراکتر رو در یک بایت فرض میکنه چون تعریف اون *char هست !! در واقع LPSTR اشاره گر به رشته ASCII هست نه یونیکد . اون نوع از string ها که هر کارکتر رو در دو بایت ذخیره میکنن یونیکد هستند و اشاره گر به اونها از نوع LPWSTR تعریف میشه. حالا سوالی که در ذهن آدم پیش میاد اینه ... با وجود اینکه string های وی بی همه ینوکد هستند چرا مایکروسافت به ما میگه که برای کار با اونها از LPSTR بجای LPWSTR استفاده کنیم ؟؟؟!! نکته بسیار مهم اینجاست و اونهم اینکه وی بی محیط خارج از خودش رو کاملا ASCII فرض میکنه ... شما در محیط وی بی با یونیکد کار میکنید اما به محض کار با توابع خارجی مثل توابع API یا DLL ها وی بی اونها رو بطور اتوماتیک به ASCII تبدیل میکنه . دقت کن که string های وی بی خارج از محیط وی بی دیگه یونیکد نیستند پس خیالت از این نظر راحت باشه !
نقل قول: من اول كدهامو براي console نوشته بودم. ولي بعدا تصميم گرفتم اونا رو تبديل به dll كنم كه بتونن با vb راحتتر ارتباط داشته باشن. همه كاراشم تموم كردم. فقط مونده اين قسمتش

مهم نیست که شما برای کنسول برنامه مینویسید یا ویندوز . وقتی LPSTR رو استفاده میکنید در واقع دارید بطور غیر مستقیم از این تعاریف در ویندوز استفاده میکنید :
کد:
typedef CHAR* LPSTR
typedef char CHAR

تعاریف بالا مشخص میکنه که LPSTR یک چیز کاملا ساختگیه و در واقع همون داده از نوع *char هست که در هدر WinNT.h تعریف شده ! به نظر من بهتره لینک زیر رو ببینی تا قضیه بیشتر برات جا بیافته . اگر توی لینک زیر بگردی و LPSTR رو پیدا کنی خودت میبینی که مایکروسافت این رو جلوش نوشته : Pointer to a null-terminated string of 8-bit Windows (ANSI) characters

لینک : http://msdn.microsoft.com/en-us/library/...S.85).aspx
اون لينكو ديدم. درسته. ولي چطور وقتي من با vb يه رشته كه كاراكتر فارسي هم داره به dll ميفرستم، كاراكتر هاي فارسي رو هم ميتونه با MessageBox نشون بده؟(البته متغييري هم كه دريافتش ميكنه از نوع LPSTR هست)
شما از ماکروهای تبدیل به یونیکد مثل T_ استفاده میکنید ؟؟
نه. اون ديگه چيه؟
شما کدی که نوشتی رو بهتره بزاری من ببینم که قضیه از چه قراره !
اينا كدهاي vb:
کد:
Private Declare Sub sendMLP Lib "MLP.dll" (ByVal command As String)
...
sendMLP "create/ 0/ 5/ 2/ 10/ 20/ 10/ 5/ 1/ c:\data.net"
اينا هم كدهاي VC++:
کد:
void _stdcall sendMLP(LPSTR command)
{
        MessageBox(NULL, command , "String",MB_OK | MB_ICONINFORMATION);
...
}

الان تو همين كد، وقتي توVB كاراكتر فارسي مينويسم، MessageBox نشونش ميده. تازه تو همون كد بالا با همون كاراكتر هايي كه ميفرستم خيلي از توابع C++ هم (مثل strcpy) روي همون LPSTR(متغيير command ) درست جواب نمي دن.
صفحه‌ها: 1 2