امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
string?
نویسنده پیام
arash_ele آفلاین
كاربر تک ستاره
*

ارسال‌ها: 30
موضوع‌ها: 11
تاریخ عضویت: شهریور ۱۳۸۵

تشکرها : 3
( 1 تشکر در 1 ارسال )
ارسال: #1
string?
سلام. من يه مشكل دارم. اينكه چطور ميشه از vb يه رشته رو به يه dll كه با vc++6 نوشتم(يعني دارم مي نويسم) بفرستم؟ با آرايه؟ چطور؟Confused
۰۴-شهریور-۱۳۸۷, ۱۶:۳۲:۲۲
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #2
RE: string?
شما از همون 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

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
(آخرین ویرایش در این ارسال: ۰۴-شهریور-۱۳۸۷, ۲۲:۵۷:۵۵، توسط Mamad2003.)
۰۴-شهریور-۱۳۸۷, ۲۲:۵۳:۴۲
ارسال‌ها
پاسخ
تشکر شده توسط : arash_ele
arash_ele آفلاین
كاربر تک ستاره
*

ارسال‌ها: 30
موضوع‌ها: 11
تاریخ عضویت: شهریور ۱۳۸۵

تشکرها : 3
( 1 تشکر در 1 ارسال )
ارسال: #3
RE: string?
مرسي ممّد.
يه مشكل ديگه! چطور مي تونم LPSTR رو تو char[] كپي كنم؟
۰۵-شهریور-۱۳۸۷, ۱۰:۲۳:۳۵
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #4
RE: string?
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;

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
(آخرین ویرایش در این ارسال: ۰۵-شهریور-۱۳۸۷, ۱۶:۴۵:۱۲، توسط Mamad2003.)
۰۵-شهریور-۱۳۸۷, ۱۶:۴۱:۵۳
ارسال‌ها
پاسخ
arash_ele آفلاین
كاربر تک ستاره
*

ارسال‌ها: 30
موضوع‌ها: 11
تاریخ عضویت: شهریور ۱۳۸۵

تشکرها : 3
( 1 تشکر در 1 ارسال )
ارسال: #5
RE: string?
آره خوب. strcpy رو امتحان كرده بودم. ولي مشكل اينه كه هر كاراكتر LPSTR تو بيش از يك بايت ذخيره ميشه. دقيق نمي دونم ولي فكر ميكنم تو 2 بايت. حالا مشكل من اينه كه نمي تونم اونا رو به اسكي تبديل كنم.
آخه مي دوني چيه؟ من اول كدهامو براي console نوشته بودم. ولي بعدا تصميم گرفتم اونا رو تبديل به dll كنم كه بتونن با vb راحتتر ارتباط داشته باشن. همه كاراشم تموم كردم. فقط مونده اين قسمتش. ****
در ضمن ممنون كه با حوصله جواب ميدي!
۰۵-شهریور-۱۳۸۷, ۱۷:۱۱:۱۴
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #6
RE: string?
نقل قول: مشكل اينه كه هر كاراكتر 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

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
(آخرین ویرایش در این ارسال: ۰۵-شهریور-۱۳۸۷, ۱۸:۰۳:۲۵، توسط Mamad2003.)
۰۵-شهریور-۱۳۸۷, ۱۷:۵۸:۱۰
ارسال‌ها
پاسخ
arash_ele آفلاین
كاربر تک ستاره
*

ارسال‌ها: 30
موضوع‌ها: 11
تاریخ عضویت: شهریور ۱۳۸۵

تشکرها : 3
( 1 تشکر در 1 ارسال )
ارسال: #7
RE: string?
اون لينكو ديدم. درسته. ولي چطور وقتي من با vb يه رشته كه كاراكتر فارسي هم داره به dll ميفرستم، كاراكتر هاي فارسي رو هم ميتونه با MessageBox نشون بده؟(البته متغييري هم كه دريافتش ميكنه از نوع LPSTR هست)
(آخرین ویرایش در این ارسال: ۰۵-شهریور-۱۳۸۷, ۱۸:۱۷:۱۰، توسط arash_ele.)
۰۵-شهریور-۱۳۸۷, ۱۸:۱۱:۴۳
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #8
RE: string?
شما از ماکروهای تبدیل به یونیکد مثل T_ استفاده میکنید ؟؟

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
۰۵-شهریور-۱۳۸۷, ۱۸:۳۰:۰۹
ارسال‌ها
پاسخ
arash_ele آفلاین
كاربر تک ستاره
*

ارسال‌ها: 30
موضوع‌ها: 11
تاریخ عضویت: شهریور ۱۳۸۵

تشکرها : 3
( 1 تشکر در 1 ارسال )
ارسال: #9
RE: string?
نه. اون ديگه چيه؟
۰۵-شهریور-۱۳۸۷, ۱۸:۴۱:۵۷
ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #10
RE: string?
شما کدی که نوشتی رو بهتره بزاری من ببینم که قضیه از چه قراره !

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
۰۵-شهریور-۱۳۸۷, ۱۸:۴۹:۲۴
ارسال‌ها
پاسخ
arash_ele آفلاین
كاربر تک ستاره
*

ارسال‌ها: 30
موضوع‌ها: 11
تاریخ عضویت: شهریور ۱۳۸۵

تشکرها : 3
( 1 تشکر در 1 ارسال )
ارسال: #11
RE: string?
اينا كدهاي 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 ) درست جواب نمي دن.
۰۵-شهریور-۱۳۸۷, ۱۹:۰۵:۲۳
ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  char to String^ محمد حسینی 7 6,476 ۲۹-اردیبهشت-۱۳۸۸, ۲۰:۴۷:۰۱
آخرین ارسال: محمد حسینی
  basic string محمد حسینی 6 6,247 ۰۱-بهمن-۱۳۸۷, ۱۲:۲۱:۲۷
آخرین ارسال: kasrakhan

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS