Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: chuyện lạ với hàm API LoadLibrary ?

  1. #1
    Ngày gia nhập
    04 2007
    Bài viết
    30

    Mặc định chuyện lạ với hàm API LoadLibrary ?

    em viết 1 cái DLL, tên là Hook.dll , trong đó có định nghĩa 1 export function:
    Code:
    EXTERN_C __declspec(dllexport)
    LRESULT CALLBACK LLMouseEventHandler(int nCode, WPARAM wParam, LPARAM lParam)
    rồi em tạo 1 project Win32 , gọi LoadLibrary("đường dẫn đến HookDll.dll") để load cái dll trên , bất ngờ là nó trả về NULL và GetLastError được error code là 126 (ERROR_MOD_NOT_FOUND)
    em thấy lạ vì đường dẫn đảm bảo đúng , nên dùng cái DependencyWalker để check cái HookDll.dll thì nó báo missing MSVCR90D.DLL . Có lẽ vì thiếu cái này nên mới load ko được
    Sau đó em thử tạo 1 project C# , dùng P/Invoke để gọi lại LoadLibrary
    Code:
    [DllImport("Kernel32.dll", EntryPoint = "LoadLibrary")]
            static extern IntPtr LoadLibrary(string fileName);
    Lại bất ngờ là lần này load ngon lành , lạ thật , cùng 1 hàm API , gọi theo kiểu native thì hỏng , mà dùng P/Invoke thì được , ai giải thích với

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    project với file dll của bạn có trong workspace ko ?
    Nếu không bạn có thể send file lên không ? Chưa gặp lần nào

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    chuyện này ko có gì lạ cả, mình gặp như cơm bữa. Lỗi ko phải tại hàm LoadLibrary vì bạn Invoke thì trước sau gì nó cũng gọi hàm này mà thôi. Đường dẫn cũng ko sai, thư viện vẫn tồn tại. Vấn đề ở đây là khi nạp thư viện MSVCR90D.DLL hệ thống sẽ gọi vào routine DllMain của MSVCR90D.dll. Tại đây thư viện này sẽ thực hiện các khởi tạo ban đầu và gặp lỗi khi mở các file .pdb ( bạn dùng filemon kiểm tra lúc nạp thư viện sẽ rõ ). Khi DllMain ko khởi tạo thành công thì nó sẽ trả về lỗi và hệ thống sẽ tự động Unload thư viện ra. Hàm LoadLibrary thì ko thấy thư viện và vội vàng tuyên bố ko tìm thấy file. Đó là toàn bộ trình tự của quá trình xuất hiện lỗi trên. Ko có gì lạ và cũng ko có gì khó tưởng tượng
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    04 2007
    Bài viết
    30

    cám ơn bạn quá ,mình hỏi cả trên codeguru, msdn forum, thinkdigit ... mà tụi nó ứ trả lời, may gặp được bạn mèo
    mình hỏi thêm , thực ra cái MSVCR90D.dll làm chức năng gì, và theo bạn nói (dù mình vẫn chưa hiểu lắm) thì sao khi P/Invoke nó trong C# ko bị lỗi
    Thêm nữa , cái hàm mình đặt tên LLMouseEventHandler nhưng khi xem trong cái Dependency Walker thấy nó đặt tên là _LLMouseEventHandler@12 , làm mình lúc gọi GetProcAddress phải dùng tên mới , nếu dùng LLMouseEventHandler thì nó ko nhận ra , cái này hình như liên quan đến C++ naming convention gì đấy , nhưng mình ko hiểu lắm

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi HKuspc Xem bài viết
    cám ơn bạn quá ,mình hỏi cả trên codeguru, msdn forum, thinkdigit ... mà tụi nó ứ trả lời, may gặp được bạn mèo
    mình hỏi thêm , thực ra cái MSVCR90D.dll làm chức năng gì, và theo bạn nói (dù mình vẫn chưa hiểu lắm) thì sao khi P/Invoke nó trong C# ko bị lỗi
    Thêm nữa , cái hàm mình đặt tên LLMouseEventHandler nhưng khi xem trong cái Dependency Walker thấy nó đặt tên là _LLMouseEventHandler@12 , làm mình lúc gọi GetProcAddress phải dùng tên mới , nếu dùng LLMouseEventHandler thì nó ko nhận ra , cái này hình như liên quan đến C++ naming convention gì đấy , nhưng mình ko hiểu lắm
    File MSVCR90D.dll là thư viện dùng để debug của vc++, nếu bạn build ở chế độ Release thì sẽ ko có nó nữa. Chuyện gặp lỗi của thư viện này khá hên xui, ko phải lúc nào cũng bị. Nguyên nhân là do có file debug info rác (*.pdb) gây ra. Bạn vào thư mục windows, search hết các file MSVCR90*.pdb và xóa đi thì sẽ hết lỗi.
    Còn cái vụ tên hàm thì ko có code nên mình ko thể nói điều gì được.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    04 2007
    Bài viết
    30

    Mặc định chuyện lạ với hàm API LoadLibrary ?

    đoạn code trong dll của mình đây ,mới học Hook nên viết 1 hàm đơn giản để check mouse move thôi, dễ đọc dễ hiểu
    Code:
    #include<iostream>
    #include<stdio.h>
    #include<windows.h>
    using namespace std;
    
    EXTERN_C __declspec(dllexport)
    LRESULT CALLBACK LLMouseEventHandler(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if((DWORD)wParam != WM_MOUSEMOVE)
    	{
    		cout<<nCode<<'\n';
    		if((DWORD)wParam == WM_LBUTTONDOWN) cout<<"Left button down !\n";
    		MSLLHOOKSTRUCT* LLMouseStructPtr = (MSLLHOOKSTRUCT*)lParam;	
    		cout<<LLMouseStructPtr->pt.x<<"-"<<LLMouseStructPtr->pt.y<<'\n';
    		cout<<LLMouseStructPtr->mouseData<<'\n';
    		cout<<"ExE\n\n";
    	}
    	return CallNextHookEx(NULL,nCode,wParam,lParam);
    }
    
    EXTERN_C __declspec(dllexport)
    void TestExportedDll(WPARAM s)
    {
    	cout<<"The value is : "<<s;
    }
    trong cái ảnh là screenshot của DependencyWalker , thấy rõ nó đổi tên hàm lại là _LLMouseEventHandler@12
    Attached Thumbnails Attached Thumbnails dw.jpg  

  7. #7
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn bỏ chữ CALLBACK phía trước hàm thì nó sẽ mất dấu _ ngay.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  8. #8
    Ngày gia nhập
    04 2007
    Bài viết
    30

    cám ơn bạn, đúng vậy thật, hâm mộ bạn quá ^^

  9. #9
    Ngày gia nhập
    04 2010
    Bài viết
    1

    Cho mình hỏi tý với, khi sử dụng LoadLibrary để tải file dll lên, thì làm sao để dùng được các phương thức cũng như thuộc tính trong file dll đấy thế. Mình tìm mãi mà không tìm thầy phương thức nào giúp mình muốn gọi cái phương thức trong thư viện mình vừa tải lên. giúp mình với

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

  1. Mẹo hay khi chuyển nhà trọn gói, chuyển văn phòng
    Gửi bởi quynhcute trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 20-08-2012, 09:53 PM
  2. Trả lời: 0
    Bài viết cuối: 07-08-2012, 05:12 PM
  3. Trả lời: 20
    Bài viết cuối: 27-02-2012, 12:05 AM
  4. ADO.NET Chuyể Phần mềm QLNS sang Ngôn ngữ Dynamic Programming. Ai chuyển giúp mình!?
    Gửi bởi huynhanhton trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 03-04-2011, 11:41 PM
  5. Calling DLL by LoadLibrary/GetProcAddress Error in service?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 08-12-2009, 09:05 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