Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: Bị lỗi khi gọi hàm lstrlenA ở thư viện kernel32.dll(VC++6.0)

  1. #1
    No Avatar
    nguyenk2089@yahoo.com Khách

    Mặc định Bị lỗi khi gọi hàm lstrlenA ở thư viện kernel32.dll(VC++6.0)

    sdfasdfa sfsadf
    Đã được chỉnh sửa lần cuối bởi nguyenk2089@yahoo.com : 25-08-2008 lúc 03:01 PM.

  2. #2
    No Avatar
    nguyenk2089@yahoo.com Khách

    mong mọi người giúp đở gấp

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

    Hàm lstrlenA đã được khai báo sẵn trong windows.h, bạn đâu cần phải làm cách này. Mà nếu như bạn muốn nạp thư viện động thì làm vầy cũng không đúng. Hàm này có cú pháp int _stdcall lstrlenA(LPCTSTR lpString), tham số truyền vào là một con trỏ trỏ đến chuỗi chứ đâu phải một con số nguyên. Cứ coi như theo ý bạn là biến t1 là con trỏ kiểu chuỗi đi nữa thì cũng có lỗi bởi vì t1 tự nhiên lại trỏ đến một vùng nhớ có địa chỉ là 3434 ( đây là vùng nhớ không truy cập được ở mức user mode trong windows ). Đây là code mình đã fix lại :

    Code:
    #include "stdafx.h"
    
    typedef long (_stdcall *Myfun)(long);
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	Myfun pfun;
    	HMODULE hMod;
    
    	hMod = LoadLibrary("kernel32.dll");
    	pfun = (Myfun)GetProcAddress(hMod,"lstrlenA");
    	char s[] = { "abcdef" };
    	long t1 = (long)&s;
    	long t2 = (pfun)(t1);
    
    	return 0;
    }
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 15-08-2008 lúc 11:47 AM.
    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
    No Avatar
    nguyenk2089@yahoo.com Khách

    cám ơn bạn. Vì đoạn code mình gởi là mình phải chuyển code từ VB. bộ phận VB viết chức năng này dùng để mã hòa và giải mã. ở VB nó viết như vậy nên mình phải theo ý của họ. mìn cũng không hiểu sao VB nó lại gọi hàm lstrlenA từ thư viện kernel32.dll như sau (thấy nó chạy ok):

    Option Explicit
    Public Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long

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

    Bản thân VB khi gọi hàm đã là gọi theo kiểu _stdcall rồi, tham số ByVal lpString As Long trong trường hợp này là chứa giá trị của biến con trỏ trỏ đến địa chỉ của chuỗi. Khi chuyển code qua VC6 bạn nên gọi trực tiếp hàm lstrlen vì nó đã được khai báo sẵn trong windows.h rồi.
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 15-08-2008 lúc 04:46 PM.
    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
    No Avatar
    nguyenk2089@yahoo.com Khách

    Mặc định Bị lỗi khi gọi hàm lstrlenA ở thư viện kernel32.dll(VC++6.0)

    bạn có biết ý nghĩa cũa hàm này kô ? vì mình phải chuyển từ VB->VC nhưng nó không hiểu.

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

    Hàm này để lấy độ dài chuỗi. Tham số truyền vào là con trỏ trỏ đến chuỗi null terminate string, trả về độ dài của chuỗi. Nó giống như hàm Len của VB vậy đó.
    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
    No Avatar
    nguyenk2089@yahoo.com Khách

    bạn biết làm sao để mình trả về là 1 địa chỉ kiễu long ở c++.
    ví dụ : ? = hamtrave(??). thì ? có giá trị trả về là con trỏ địa chỉ kiểu long thì mình sẽ khai báo như thế nào ? cám ơn bạn nhiều

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

    bạn ví dụ cụ thể hơn đi, mình chẳng hiểu bạn hỏi cái gì cả. ý bạn là muốn làm như thế nào ? nếu muốn lấy địa chỉ của biến thì dùng toán tử &, muốn lấy giá trị địa chỉ dưới dạng số long thì ép kiểu. code của mình đưa lên có minh hoạ sẵn đó.
    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.

  10. #10
    No Avatar
    nguyenk2089@yahoo.com Khách

    bạn có biết lấy giá trị từ điạ chỉ vùng nhớ không ? ví dụ tôi có 1 địa chỉ vùng nhớ là : char *s = "0x0032c2750"; và tôi muốn lấy giá trị của nó tại địa chỉ này ? cám ơn bạn nhiều.

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

  1. fatal error LNK1104: cannot open file 'kernel32.lib' làm sao sửa??
    Gửi bởi kimthanh14 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 03-05-2011, 11:22 AM

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