cuốn sách gpt4 ai đã làm

c++ - Trình xử lý SEH tùy chỉnh với /SAFESEH

In lại Tác giả: Hồ Xil Thời gian cập nhật: 2023-11-01 13:32:34 37 4
mua khóa gpt4 Nike

Tôi hiện đang cố gắng tạo một trình biên dịch trong C++ có thể tạo mã máy khi chạy. Tuy nhiên, tôi hiện đang cố gắng kích hoạt xử lý ngoại lệ an toàn (biên dịch bằng/SAFESEH). Trình xử lý ngoại lệ tùy chỉnh của tôi hoạt động ở chế độ Gỡ lỗi, nhưng khi tôi chạy cùng mã đó ở chế độ Phát hành, quy trình của tôi sẽ bị hủy.

Tôi khá chắc chắn rằng vấn đề là tôi đã không đăng ký được trình xử lý ngoại lệ tùy chỉnh của mình như thế này, vì khi tôi biên dịch mã của mình bằng /SAFESEH:NO, mọi thứ vẫn hoạt động tốt ngay cả trong chế độ Phát hành.

Trình xử lý ngoại lệ tùy chỉnh của tôi được viết bằng mã C++ khác của tôi và tôi đang cố gắng đăng ký nó làm trình xử lý ngoại lệ bằng cách thêm tệp .asm vào dự án của mình với nội dung sau:

.386
.model phẳng
_MyExceptionHandler@16 nguyên mẫu
.safeseh _MyExceptionHandler@16
end

mô tảđây .Sau đó tập hợp tệp asm bằng tùy chọn /safeseh (trong số các tùy chọn khác).

Hàm xử lý của tôi hiện có khai báo sau:

bên ngoài "C" EXCEPTION_DISPOSITION __stdcall MyExceptionHandler(struct
_EXCEPTION_RECORD *Bản ghi ngoại lệ, void * Khung thành lập, cấu trúc
_CONTEXT *Bản ghi bối cảnh, void * DispatcherContext);

Cách chính xác để đăng ký hàm này làm trình xử lý ngoại lệ là gì?

Cảm ơn vì lời khuyên nào!

câu trả lời hay nhất

Cuối cùng tôi đã tìm thấy một trang mô tả vấn đề:đây .Tuy nhiên, các ví dụ về mã trong trang sẽ không hoạt động nếu không sửa đổi.

Vấn đề có vẻ là việc đăng ký chương trình bên ngoài làm trình xử lý ngoại lệ không hoạt động như mong đợi, do đó, thay vào đó, bạn phải đăng ký chương trình hợp ngữ cục bộ làm trình xử lý ngoại lệ.

Dựa trên ví dụ được đưa ra trên trang được đề cập trước đó, đây là kết quả mà tôi đã đạt được:

.386
.model phẳng, stdcall
sơ đồ trường hợp tùy chọn: không có

bên ngoài MyExceptionHandler@16:gần

Proto MyExceptionHandlerAsm
.SAFESEH MyExceptionHandlerAsm

.mã số
Quá trình MyExceptionHandlerAsm
jmp MyExceptionHandler@16
MyExceptionHandlerAsm kết thúc
end

Điều này có vẻ hiệu quả nhưng có lẽ không phải là giải pháp tao nhã nhất. Ví dụ: Để tránh lỗi liên kết khi tham chiếu MyExceptionHandlerAsm từ C/C++, tôi phải khai báo như sau:

bên ngoài "C" int __stdcall MyExceptionHandlerAsm();

Nếu ai đó cố gắng gọi MyExceptionHandlerAsm từ C/C++, nó sẽ gặp sự cố vì số lượng tham số không khớp với số lượng MyExceptionHandlers.

Về c++ - Trình xử lý SEH tùy chỉnh với/SAFESEH, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/12019689/

37 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress