Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 26 kết quả

Đề tài: cách gọi hàm API trong VC++

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

    Mặc định cách gọi hàm API trong VC++

    mình có biết đến hàm API trong VB nhưng mình không biết cách gọi nó trong VC++ mọi người có thể giúp mình không
    VD đây là hàm tắt máy trong VC++
    PHP Code:
    #include <windows.h>

    int main()
    {
         
    ExitWindowsEx(EWX_LOGOFF0);
         return 
    0;

    PHP Code:
    'In general section
    Const EWX_LOGOFF = 0
    Const EWX_SHUTDOWN = 1
    Const EWX_REBOOT = 2
    Const EWX_FORCE = 4
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
    Private Sub Form_Load()
        '
    KPD-Team 1998
        
    'URL: http://www.allapi.net/
        '
    E-MailKPDTeam@Allapi.net
        msg 
    MsgBox("This program is going to reboot your computer. Press OK to continue or Cancel to stop."vbCritical vbOKCancel 256App.Title)
        If 
    msg vbCancel Then End
        
    'reboot the computer
        ret& = ExitWindowsEx(EWX_FORCE Or EWX_REBOOT, 0)
    End Sub 
    còn đay là trong VB
    tức trong VB thì
    PHP Code:
     Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As LongByVal dwReserved As Long) As Long 
    là gọi hàm API nhưng nếu mình cứ áp dụng cách đó cho các hàm khác của API thì không được VD như hàm
    down load 1 file như thế này trong VB
    PHP Code:
    Private Declare Function DoFileDownload Lib "shdocvw.dll" (ByVal lpszFile As String) As Long
    Private Sub Form_Load()
        
    'KPD-Team 2000
        '
    URLhttp://www.allapi.net/
        
    'E-Mail: KPDTeam@Allapi.net
       DoFileDownload StrConv("http://www.allapi.net/", vbUnicode)
    End Sub 
    nhưng nếu chuyển sang VC++ là
    PHP Code:
    #include<iostream.h>
    #include<windows.h>
    int main()
    {
        
    long a;
         
    DoFileDownload("http://www.allapi.net/");

    thì không được,mọi người có gì chỉ giáo hộ cách sử dụng được không

  2. #2
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    DoFileDownload
    KHÔNG CÓ HÀM NÀY TRONG vc++ 6 ĐÂU CẬU AH,CÓ THỂ LÀ 1 HÀM KHÁC TƯƠNG TỰ,MÌNH CŨNG KHÔNG RÕ LẮM

  3. #3
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Gọi hàm API trực tiếp luôn trong visual c được là nhờ nó có các file header include rồi, ko có thì bạn phải dùng LoadLibrary load shdocvw.dll, sau đó lấy địa chỉ hàm API = GetProcAddress rồi sau đó gọi hàm qua con trỏ hàm
    Life:\> dir

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Gọi hàm API trực tiếp luôn trong visual c được là nhờ nó có các file header include rồi, ko có thì bạn phải dùng LoadLibrary load shdocvw.dll, sau đó lấy địa chỉ hàm API = GetProcAddress rồi sau đó gọi hàm qua con trỏ hàm
    nghĩa là cái hàm cho phép down load này
    DoFileDownload
    phải gọi qua thư viện như thế này ah
    Code:
    #include<"shdocvw.dll" >

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Ặc bó tay, thui cho bạn code luôn vậy.
    Code:
    typedef LRESULT (WINAPI *DOFILEDOWNLOAD) (LPCSTR);
    
    DOFILEDOWNLOAD DoFileDownload;
    
    //phần này trong main
    HMODULE hMod= LoadLibrary ("shdocvw.dll");
    if (!hMod) return 0;
    DoFileDownload = GetProcAddress (hMod, "DoFileDownload");
    if (!DoFileDownload) return 0;
    
    DoFileDownload ("http://www.allapi.net/");
    Mình ko rõ hàm API này có bắt buộc tham số là unicode ko (nhìn code vb thì chắc là có), code này chỉ là mẫu cách gọi hàm trong dll thôi. Vào msdn để tham khảo thêm
    Life:\> dir

  6. #6
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mặc định cách gọi hàm API trong VC++

    sau đó lấy địa chỉ hàm API = GetProcAddress rồi sau đó gọi hàm qua con trỏ hàm
    Nhưng GetProcAddress ko có version cho UNICODE thì phải làm sao đây?
    pEnGwINUS.

  7. #7
    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 hieubm Xem bài viết
    Nhưng GetProcAddress ko có version cho UNICODE thì phải làm sao đây?
    Tên hàm API được lưu trong vùng PE là chuỗi null terminated string, ko phải chuỗi unicode. Còn tên thư viện thì có hỗ trợ unicode : LoadLibraryA, LoadLibraryW
    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
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Nếu bạn sử dụng MFC thì hầu như tất cả các hàm API đã được map vào trong bộ class này. Nếu như không có thì việc sử dụng API trong VC++ là rất đơn giản, chỉ cần bạn import/load DLL của chúng và sử dụng như những hàm khác. Có nhiều cách để import/load DLL chẳng hạn:

    Cách 1: Sử dụng #import directive preprocessor
    Visual C++ Code:
    1. //Import shdocvw.dll with named_guids
    2. #import "shdocvw.dll" named_guids
    3. //Import user32.lib with no_namespace
    4. #import "user32.lib" no_namespace
    5.  
    6. // Link to referent about #import: http://msdn.microsoft.com/en-us/library/8etzzkb6(VS.71).aspx


    Cách 2: Sử dụng hàm LoadLibrary

    Visual C++ Code:
    1. HMODULE hModuleTEST;
    2.  
    3. // Program execution begins
    4. hModuleTEST = LoadLibrary(_T("shdocvw.dll"));
    5.  
    6. //Do something here
    7.  
    8. // Program execution ends
    9. FreeLibrary(hModuleTEST);


    và còn nhiều cách khác nữa, nhưng trên là 2 cách phổ biến.

    Hi vọng nó sẽ giúp ích cho bạn!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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

    PHP Code:
    #include<iostream>
    #include<windows.h>
    //Import shdocvw.dll with named_guids
    #import "shdocvw.dll" named_guids
    //Import user32.lib with no_namespace
    #import "user32.lib" no_namespace
    int main()
    {
         
    DoFileDownload("http://www.allapi.net/");
         return 
    0;

    như anh nói thì em làm thế này,nhưng đây là lỗi
    Code:
    --------------------Configuration: fgjjg - Win32 Debug--------------------
    Compiling...
    sdg.cpp
    C:\Program Files\Microsoft Visual Studio\MyProjects\fgjjg\sdg.cpp(6) : fatal error C1083: Cannot open type library file: 'user32.lib': Error loading type library/DLL.
    Error executing cl.exe.
    
    fgjjg.exe - 1 error(s), 0 warning(s)

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Đó là ví dụ thôi cậu ơi, cậu phải tìm hiểu nó trước khi sử dụng chứ.

    user32.lib không phải import vì có thể nó đã được load default bởi VC++ rồi thì phải. Tớ sửa lại một chút về việc import như sau, tuy nhiên tớ không biết cách sử dụng thư viện shdocvw.dll như thế nào cả, nghe có vẽ như nó đã được load vào VC++ rồi để sử dụng cho cái Web control. Cậu có thể sử dụng Web control để download hoặc làm việc với mấy thứ liên quan đến web.

    Visual C++ Code:
    1. //Import shdocvw.dll
    2. #import <shdocvw.dll>   include (_T("OLECMDID"), _T("tagREADYSTATE"), _T("OLECMDF"), _T("OLECMDEXECOPT"))
    3.                         rename (_T("FindText"), _T("ShFindText"))
    4. #pragma comment(lib, "user32.lib") //The linker to search for the user32.lib library while linking.

    Xin lỗi cho tớ là: Tớ có làm về VC++ nhưng tớ không thích đồ MS nên không tìm hiểu kỹ ngoài việc sử dụng nó để giải quyết vấn đề đặt ra.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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