Làm sao mình gọi được biến này?

#include <windows.h>
#include <Lmcons.h>
#include <iostream>

using namespace std;

char getUserName(){
 char username[UNLEN+1];
 DWORD username_len = UNLEN+1;
 GetUserName(username, &username_len);
}

int main(){
    cout << username;
}

Hàm trên getUserName là hàm lấy tên user của windows
Giờ mình muốn cout cái giá trị username ở trong main thì làm như nào ạ?
Mình để return username ở hàm getUserName thì lại bị lỗi…

Đầu tiên em hãy học cách post code với markdown ở đây

Thứ 2. Em phải xem cái hàm GetUserName trả về cái gì rồi mới return được chứ? Ở đây return về 1. Nghĩa là get Username thành công. Còn tên của nó chính là mảng char username.
Ví dụ

#include <iostream>
#include <windows.h>
#include <lmcons.h>
#include <string>

std::string getUserName()
{
	char username[UNLEN+1];
	DWORD username_len = UNLEN+1;;
	if(:: GetUserName(username, &username_len))) return username;
	else return {}; // or: return "" ;
}

int main()
{
	std::cout <<"Tên Máy Tính: " <<  getUserName() << '\n';
}

ref

1 Like
#include <windows.h>
#include <iostream>
#include <cstdlib>

#define MAX_SIZE 128

using namespace std;

LPTSTR* getUserName() {
    LPTSTR *username;
    username = malloc(MAX_SIZE + 1);
    DWORD username_len = MAX_SIZE;
    GetUserName(username, &username_len);

    return username;
}

int main() {
    LPTSTR *name = getUserName();
    cout << name();

    free(name);

    return 0;
}
1 Like

Là sao vậy bạn,mình chưa hiểu cái đó lắm
với cả free(name) nữa.

@qtd anh ơi vậy có cách nào em gọi giá trị của biến username ra ở trong hàm main() ko anh?

Ủa, em chưa chạy code ở trên reply của anh à?
Khi em gọi 2 hàm đó nó sẽ trả về tên máy của em.
Nếu em muốn lưu nó thì tạo ra 1 biến const sting như @petehouston hướng dẫn

 LPTSTR *name = getUserName();
1 Like

Anh ơi,có phải GetUserName(username, &username_len); -> là một boolean chỉ in ra đúng/sai -> 0/1 phải ko anh?

Em thử compile code của anh trên VS2012 mà bị lỗi ạ @@

Em thử chuyển char *getUserName()
rồi return userName;
sau đó trong main thì em đặt char *ptr = getUserName();
khi in cái ptr ra thì được mỗi chữ cái đầu tiên…Zer0 còn có mỗi Z là sao anh nhỉ

Cái LPTSTR -> định dạng unicode đúng ko anh?

1 Like
LPTSTR getUserName() {
    LPTSTR username;
    username = (LPTSTR)malloc(MAX_SIZE + 1);
    DWORD username_len = MAX_SIZE;
    GetUserName(username, &username_len);

    return username;
}

int main() {
    LPTSTR name = getUserName();
    cout << name;

    free(name);

    return 0;
}

LPTSTR = Long Pointer To String
Mặc định nó là con trỏ rồi nên ko cần con trỏ nữa. Trừ khi muốn tạo thành một mảng.

3 Likes

Cám ơn bạn,bạn có thể chỉ mình cái : (LPTSTR)malloc(MAX_SIZE + 1) và free(name) được ko,mình chưa hiểu 2 cái đó :stuck_out_tongue: Thanks

Cái này gọi là cấp phát động.

LPTSTR là một con trỏ.
Giá trị lưu trữ của con trỏ là một địa chỉ.
Và muốn tính toán gì thì phải đi tới địa chỉ kia để tính toán.
Khi mới khai báo, con trỏ thường trỏ lung tung.
Vậy nên ta mới cấp phát cho nó một vùng nhớ để trỏ tới để xài/xử lý trên đó. Thì hàm malloc trên có chức năng là như vậy.
Sau khi xài xong thì mình là coder có tâm, xài xong là mình phải trả vùng nhớ mình xin trước đo cho hệ điều hành để không rò rỉ bộ nhớ, thì hàm free có chức năng này :grin:

Tuy nhiên 2 hàm trên là của C, C++ thì có new và delete.

Bạn tìm thêm về con trỏ và cấp phát động đọc thêm nhé. Phần này cũng dài lắm, ở trên mình chỉ nói chút xíu thôi.

1 Like

Thanks bạn hình như mình có nghe qua cấp phát động trên clip của anh Đạt mà đó giờ ko có sài nên quên . để xem lại.cám ơn bạn nhé + cái malloc thấy lạ :frowning: chưa thấy bh

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?