Trang 4 trên tổng số 4 Đầu tiênĐầu tiên ... 234
Từ 31 tới 38 trên tổng số 38 kết quả

Đề tài: Tìm hiểu về thư viện liên kết động trên Win32 API

  1. #31
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Mặc định Tìm hiểu về thư viện liên kết động trên Win32 API

    Giải thích rõ hơn ý của anh Kevin 1 tí cho các bạn dễ hiểu.Tên hàm được export trong DLL khi ta dùng extern "C" thì nó sẽ bỏ đi name mangling của C++(vốn có quy ước đặt tên khá loằng ngoằng,khó nhìn) nên người ta hay dùng extern "C" là để tên hàm được export dễ nhìn hơn.

    Chẳn hạn như là ta có hàm sau,compile trên VS2008.

    C Code:
    1. int __cdecl BinhPhuong(int a){
    2.  
    3.     return a*a;
    4. }

    Thì khi export ra có tên là

    Code:
    ?BinhPhuong@@YAHH@Z
    Còn nếu thêm extend "C" vào thì tên hàm được export là

    Code:
    BinhPhuong
    Đã được chỉnh sửa lần cuối bởi lttq : 22-05-2012 lúc 08:23 PM.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  2. #32
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Thank anh Hoàng và lttq

    Em có tham khảo tài liệu, thì nếu code là C++ thì không nên extern "C" .

    Em có 1 cách khác để export vẫn giữ nguyên được tên hàm :

    Tạo 1 Module-Definition File ( *.def ) trong thư mục chứa source code của project build DLL, nội dung file def :

    Code:
    ;LIBRARY [Tên DLL]
    LIBRARY DLLTutorial
    
    EXPORTS
    ;[Tên muốn thay đổi thành] [Ordinal export]
        Cong2So @1
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Screenshot_10.png
Lần xem:	19
Size:		217.1 KB
ID:		9472

    Sau đó khai báo def đó trong project

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Screenshot_9.png
Lần xem:	24
Size:		127.3 KB
ID:		9471

    Clean Solution và Build lại , ta có

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Screenshot_8.png
Lần xem:	18
Size:		40.8 KB
ID:		9470
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 23-05-2012 lúc 07:58 AM.

  3. #33
    Ngày gia nhập
    06 2012
    Bài viết
    4

    chào langman.
    anh cho em hỏi trong ví dụ 2 của chapter3. anh add 2 file edrlib.h và edrlib.cpp vào trong project bằng cách nào
    em xin cám ơn anh

  4. #34
    Ngày gia nhập
    08 2013
    Bài viết
    5

    Bài viết rất hay, xin cảm ơn tác giả.
    Tôi đang làm một ứng dụng có một module hook toàn cục kiểu như bộ gõ máy tính.
    Khi ứng dụng của tôi bị crash thì không thể UNREFERENCED_PARAMETER hay ::FreeLibrary cái dll hook kia được dẫn tới tình trạng gây treo máy luôn.
    Ai đã từng gặp phải vấn đề này xin chia sẻ với tôi giải pháp để khắc phục.
    Xin cảm ơn rất nhiều!
    Hãy làm việc hết mình, những điều tốt đẹp sẽ đến với bạn!

  5. #35
    Ngày gia nhập
    06 2012
    Bài viết
    18

    [QUOTE=langman;208198]

    C++ Code:
    1.  
    2. #define EXPORT extern "C" __declspec(dllexport)
    3.  
    4. #pragma data_seg("shared")
    5.  
    6.     int qdelay=0;
    7.  
    8. #pragma data_seg()
    9.  
    10. #pragma comment(linker,"/SECTION:shared,RWS")
    11.  
    12.  
    13. EXPORT void APIENTRY setqdelay(int n)
    14. {
    15.     qdelay=n;
    16. }
    17. EXPORT int APIENTRY getqdelay()
    18. {
    19.     return qdelay;
    20. }

    #pragma comment(linker,"/SECTION:shared,RWS")
    RWS ở đây là READ WRITE SHARED , là thuộc tính của vùng nhớ này
    để hiểu sâu hơn về vấn đề này, tra MSDN về FILE MAPPING hoặc chờ tut sắp tới của mình tại cộng đồng c việt

    Chào anh langman và các thành viên của 4rum !
    Mình có 1 vấn đề chưa hiểu mong được mọi người chỉ dẫn. Đó là nếu một biến như ví dụ trên lưu trong .dll file qdelay=0, thì khí App1 load và sử dụng biến này, sau đó App1 dùng hàm setqdelay(n) thay đổi giá trị của biến qdelay này. Tiếp đến có 1 app khác load .dll file này (ví dụ App2) và App2 sử dụng biến này, khi App2 dùng hàm getqdelay() để đọc giá trị của qdelay thì giá trị qdelay lúc này bằng n hay là bằng 0? và nếu có thế hãy giải thích dùm mình tại sao ?

  6. #36
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    748

    Mặc định Tìm hiểu về thư viện liên kết động trên Win32 API

    ""...Mình có 1 vấn đề chưa hiểu mong được mọi người chỉ dẫn. Đó là nếu một biến như ví dụ trên lưu trong .dll file qdelay=0, thì khí App1 load và sử dụng biến này, sau đó App1 dùng hàm setqdelay(n) thay đổi giá trị của biến qdelay này. Tiếp đến có 1 app khác load .dll file này (ví dụ App2) và App2 sử dụng biến này, khi App2 dùng hàm getqdelay() để đọc giá trị của qdelay thì giá trị qdelay lúc này bằng n hay là bằng 0? và nếu có thế hãy giải thích dùm mình tại sao ?".

    Theo mình thì giá trị qdelay lúc này bằng n.

    Thuộc tính của phân đoạn (Section trong PE) được xác định là RWS (Đọc, viết, dùng chung). Khi dll được nạp lên, nơi lưu trữ biến này nằm ở vùng dữ liệu dll (không phải Heap cũng không phải Stack), cơ chế Windows dành cho các dll là đếm tham chiếu - có bao nhiêu ứng dụng gọi tới nó thì cũng chỉ có 1 thể hiện dll mà thôi và vùng dữ liệu dùng chung đó cũng chỉ có 1. Ứng dụng nào thiết lập giá trị cho biến thì nó sẽ giữ nguyên giá trị cho tới khi ứng dụng khác thay đổi.

    Vì một vài cách thức quản lý nên các biến muốn được khai báo dùng chung giữa các tiến trình phải được viết như có gán giá trị khởi tạo, nếu không thì dù cho có khai báo dùng chung bộ biên dịch vẫn xem nó như biến của riêng tiến trình mà thôi.

    Mình ủng hộ bài viết sắp tới của bạn !
    Yêu mã hơn yêu em !!!

  7. #37
    Ngày gia nhập
    08 2017
    Bài viết
    1

    em mới tải ntdll.lib và ntdll.dll. anh có thể giúp em làm thế nào để add vào project để có thể sử dụng ko ạ

  8. #38
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    748

    Nếu bạn đang dùng HĐH Windows và IDE là các phiên bản VC++ thì không cần tải 2 thư viện trên làm gì.
    Vẫn muốn dùng nó thử nghiệm thì vào trang thuộc tính dự án -> VC++ Diectories -> Cộng thêm các đường dẫn vào các thư mục tương ứng và di chuyển nó lên trên (điều này để bảo đảm khi biên dịch - liên kết, IDE sẽ nhìn thấy và sử dụng cái của chúng ta. Trong trường hợp không đưa lên thì IDE sẽ nhìn thấy các lib và dll trong trong các đường dẫn mặc định).
    Yêu mã hơn yêu em !!!

Trang 4 trên tổng số 4 Đầu tiênĐầu tiên ... 234

Các đề tài tương tự

  1. Các kĩ thuật ẩn lời gọi hàm API trên Win32 [Tài liệu tổng hợp]
    Gửi bởi quangnh89 trong diễn đàn Lập trình Virus & Anti-Virus
    Trả lời: 6
    Bài viết cuối: 11-08-2015, 11:20 PM
  2. Mã nguồn C Lỗi Unhandled win32 exception occurred liên quan tới bộ nhớ ???
    Gửi bởi cobratnt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 31-03-2011, 10:47 PM
  3. Làm thế nào để liên lạc giữa 2 ứng dụng trong win32
    Gửi bởi mfc trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 30-01-2011, 10:32 AM
  4. Tiếng việt trên win32 Console?
    Gửi bởi langman trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 27-04-2010, 10:23 PM
  5. cách liên kết các dialog với nhau trong win32 cua c 6.0
    Gửi bởi it_2010 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 26-03-2010, 01:50 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn