banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8  XML
  [Programming]   [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 12:35:59 (+0700) | #1 | 130626
Z0diac
Member

[Minus]    0    [Plus]
Joined: 25/04/2008 02:49:37
Messages: 21
Offline
[Profile] [PM]
Mình đang học về C++ và mình dùng VS 2005. Trong môi trường của VS 2005, khi mình dùng các hàm API như (RegisterWindowMessage, GetModuleFileName, LoadLibrary,...) thì nếu tham sỗ mình truyền vào là kiểu char thì ngay lập tức nó báo lỗi và bắt mình phải chuyển về kiểu wchar_t thì mời dùng được. Mình thử search 1 hàm (ví dụ : RegisterWindowMessage) trong MSDN thì mình thấy có 2 hàm sau : RegisterWindowMessage và RegisterWindowMessageW . Trong đó chỉ có hàm RegisterWindowMessageW là bắt buộc mình phải dùng kiểu wchar_t.

Vậy mình xin hỏi là : Có phải trong môi trường VC 8(VS 2005) , các hàm API như trên sẽ tự động được mặc định sang các dạng như RegisterWindowMessageW, GetModuleFileNameW,... phải không ạ?

Nếu mình chỉ muốn dùng các hàm API dạng cũ (không có kí tự W sau cùng) thì phải làm sao?

P/S: Nếu câu hỏi của mình có gì không rõ ràng xin các bạn thông cảm dùm.
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 13:07:55 (+0700) | #2 | 130628
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
các API liên quan đến chuỗi có 2 phiên bản, bản kết thúc = A dành cho ansi, kết thúc = W dành cho unicode. bản vc++ 8 mặc định dùng bản unicode, để gọi các hàm dùng ansi bạn viết dạng đầy đủ của nó ra như "MessageBoxA". Hoặc bạn có thể vào project properties để điều chỉnh lại mặc định về ansi.
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 13:17:17 (+0700) | #3 | 130634
Z0diac
Member

[Minus]    0    [Plus]
Joined: 25/04/2008 02:49:37
Messages: 21
Offline
[Profile] [PM]
Yah! Cảm ơn bạn.
Tiện đây mình cũng muốn hỏi thêm vấn đề này.

Khi mình viết hàm này trong ứng dụng Hook của mình (mình đang tập tành tìm hiểu)

Code:
LRESULT CALLBACK MyWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)

và khi biên dịch thì nó thông báo một warning như sau

Code:
warning C4311: 'type cast' : pointer truncation from 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'LONG'
warning C4312: 'type cast' : conversion from 'LONG' to 'WNDPROC' of greater size 
warning C4311: 'type cast' : pointer truncation from 'WNDPROC' to 'LONG'


Mình thật sự không hiểu tại sao nó warning như vậy trong môi trường của VC 8 trong khi VC 6 biên dịch bình thường.



[Up] [Print Copy]
  [Question]   Re: [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 13:55:09 (+0700) | #4 | 130637
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
đó là do bạn đang ép kiểu từ một kiểu có kích thước lớn hơn sang kiểu có kích thước nhỏ hơn,
kiểu HWND, WNDPROC ... được định nghĩa là int64 (64 bit) khi chuyển sang kiểu LONG 32 bít sẽ dẫn đến có thể mất dữ liệu nên có warn đó mà.
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 14:08:39 (+0700) | #5 | 130640
Z0diac
Member

[Minus]    0    [Plus]
Joined: 25/04/2008 02:49:37
Messages: 21
Offline
[Profile] [PM]
Để mình kiểm tra lại đoạn code xem. Xin cảm ơn bạn. Nhưng tại sao ở VC 6 thì nó không bị warning gì cả mà ở VC 8 lại bị .
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 14:23:45 (+0700) | #6 | 130643
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
à, ở bản vc++6 thì HWND, WNDPROC ... được định nghĩa có kích thước 32 bit thôi bạn à, nên khi ép kiểu sẽ không có warn trên.
[Up] [Print Copy]
  [Question]   Re: [Hỏi]Có sự khác biệt nào khi viết các hàm API trong VC6 và 8 15/05/2008 14:32:18 (+0700) | #7 | 130645
Z0diac
Member

[Minus]    0    [Plus]
Joined: 25/04/2008 02:49:37
Messages: 21
Offline
[Profile] [PM]
Ah, mình đã khắc phục được lỗi này . Cái này khi biên dịch trên nền VS 2005, nó tự mặc định biên dịch trên nền 64 bits, nên thành ra nó sẽ xuất hiện warning. Để không xuất hiện warning và để biên dịch trên nền 32 bit trong VS 2005, thì mình đã chuyển Detect 64-bit Portability Issues thành No trong Project Properties Page.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|