2012-02-20 30 views
13

Tôi biết về quy trình không trực quan để đặt tên của chuỗi trong Windows (xem "How to set name to a Win32 Thread?"). Có cách nào để lấy tên của chủ đề không? Tôi không thấy bất kỳ API Windows nào cho phép tôi thực hiện việc này (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx).Làm cách nào để lấy tên của Chủ đề Win32?

+1

Bạn có thể lấy tên hàm bắt đầu của chủ đề nếu điều đó giúp bạn trong bất kỳ cách nào. – Nawaz

+0

@Nawaz Bạn sẽ làm như thế nào? –

+1

@CS .: Bạn đã sử dụng các API sau: [SymInitialize] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681351%28v=vs.85%29.aspx) và [SymFromAddr] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681323%28v=vs.85%29.aspx). Tôi đã sử dụng chúng, xem chủ đề này: [Nhận StartAddress của chuỗi win32 từ một quá trình khác] (http://stackoverflow.com/questions/8679406/get-startaddress-of-win32-thread-from-another-process) – Nawaz

Trả lời

12

Không có cuộc gọi WinAPI như vậy vì không tồn tại những thứ như tên chuỗi.

Nếu bạn đặt tên chuỗi thì trình gỡ lỗi của IDE sẽ lưu trữ cho bạn, điều này giúp bạn gỡ lỗi dễ dàng hơn. Tuy nhiên, tên này không bao giờ thực sự được gắn vào luồng bằng một lệnh gọi API Windows.

Nếu bạn chạy ứng dụng của mình mà không có trình gỡ lỗi thì việc đặt tên chuỗi không có hiệu lực, do đó bạn không thể truy xuất tên.

Thậm chí nếu nó có thể truy cập được - tôi sẽ không viết mã chỉ hoạt động với trình gỡ rối được đính kèm. Lưu tên tốt hơn cho chính bạn cùng với tay cầm.

+0

bạn đang nói rằng hoàn toàn không có cách nào để có được tên chủ đề mà bạn đã đặt trong trình gỡ rối? Tôi muốn đặt một số kiểm tra lỗi trong mã của tôi để đảm bảo nó được gọi từ đúng chuỗi, sử dụng tên luồng – Arthur

+0

Chủ đề 0x66c đã thoát với mã 0 (0x0) -> Tôi nghĩ, có lẽ 0x66c giống như một cái tên ? – Andre

17

Chủ đề không thực sự có tên trong Win32. Quá trình thông qua RaiseException chỉ là một "Bắt tay bí mật" với trình gỡ lỗi VS, người thực sự lưu trữ ánh xạ TID => Tên. Bản thân Windows không có khái niệm "Tên".

7

Bắt đầu với Windows 10, phiên bản 1607, giờ đây bạn có thể lấy tên của chuỗi bằng cách sử dụng GetThreadDescription(), giả sử SetThreadDescription() được sử dụng để đặt tên của chuỗi.

Dưới đây là một ví dụ:

HRESULT hr = GetThreadDescription(ThreadHandle, &data); 
if (SUCCEEDED(hr)) 
{ 
    wprintf(“%ls\m”, data); 
    LocalFree(data); 
} 

Đây là tài liệu hướng dẫn:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx

Các vấn đề liên quan