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!
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.
Tôi là một lập trình viên xuất sắc, rất giỏi!