• Thứ Năm, 24/06/2010 (GMT+7)

    Xử lý lỗi ‘429’ trong VB

    Nguyễn Anh Tuấn
    Do các phần mềm thường sử dụng rất nhiều ActiveX component nhưng không bắt lỗi để cung cấp thông tin chính xác về “nơi xảy ra lỗi” nên “429” trở thành vấn đề khó xử lý.

    “Run-time error '429': ActiveX component can't create object” là một lỗi khá phổ biến, dễ hiểu nhưng lại rất khó khắc phục. Dễ hiểu vì lỗi xảy ra khi một ActiveX component không được đăng ký đúng, chỉ cần đăng ký lại bằng lệnh: regsvr32 [ActiveX component path]. Tuy nhiên, do các phần mềm thường sử dụng rất nhiều ActiveX component nhưng không bắt lỗi để cung cấp thông tin chính xác về “nơi xảy ra lỗi” nên “429” trở thành vấn đề khó xử lý.

    Lập trình viên có thể bắt lỗi và thông báo cụ thể để giúp đội hỗ trợ cùng người dùng giải quyết nhanh chóng mọi sự cố kiểu này. Cách đơn giản nhất là dùng biến Erl kết hợp với việc đánh số dòng lệnh để thông báo dòng lệnh gây lỗi. Cẩn thận hơn, chúng ta có thể dùng mệnh đề On Error Resume Next rồi kiểm tra đối tượng sau khi tạo theo mẫu sau:

    On Error Resume Next

    msgbox "tObjName: " & tObjName

    Set cobjReportExt = CreateObject(tObjName)

    msgbox "After CreateObject"

    Screen.MousePointer = vbHourglass

    If Not (cobjReportExt Is Nothing) Then

    fileName = cobjReportExt.ReportName(RptType)

    else

    msgbox "cObjReportExt is Nothing"

    end if

    Nhưng nếu phần mềm mà bạn sử dụng không đưa ra được thông báo cụ thể thì cũng đừng nản chí. Với người dùng cuối không thạo máy tính, việc đầu tiên và đơn giản nhất là ghi nhớ thao tác thực hiện ngay trước khi phát sinh lỗi để dễ tìm kiếm giải pháp hoặc giúp nhà cung cấp có thể nhanh chóng khoanh vùng lỗi. Nếu bạn không liên lạc được với nhà cung cấp phần mềm hay họ chưa thể giúp bạn ngay, hãy thử (hoặc nhờ người thạo máy tính giúp thử) một số cách sau đây:

    1. Quét và chỉnh sửa registry với các công cụ như RegClean, đôi khi nguyên nhân của lỗi “429” nằm ở registry và có thể khắc phục bằng cách này.

    2. Xác định thư viện bị lỗi bằng cách dùng tiện ích ListDLLs của SysInternal để liệt kê và so sánh các thư viện được nạp trên máy có lỗi và các máy không bị lỗi.

    3. Dùng tiện ích miến phí Process Monitor (cho Windows 2000 SP4, Windows XP SP2, Windows Server 2003 SP1 và Windows Vista) hoặc phiên bản cũ của nó là Regmon để theo dõi việc truy cập registry khi ứng dụng đang chạy. Trước hết, khởi động Process Monitor và nhấn nút lệnh để nó ghi lại các sự kiện diễn ra với registry. Sau đó chạy ứng dụng cần theo dõi cho đến khi nó sinh lỗi “429” rồi quay lại Process Monitor lọc các thao tác do ứng dụng của bạn thực hiện (nhấn Ctl+L để gọi trình đơn Filter->Filter, đổi mục Architecture thành Process Name, gõ tên ứng dụng của bạn trong ô thứ 2 và chọn Include trong mục thứ 3 rồi nhấn nút Add, sau đó nhấn nút Apply, cuối cùng chọn trình đơn File->Save lưu các "events displayed using the current filter"). Với thông tin thu được, hãy tìm kiếm những đoạn mà thao tác “OpenKey” thất bại. Thông thường, nó liên quan tới các khoá HKCR\CLSID\NN..NN\InprocServer32 và HKCR\TypeLib\NN..NN (chuỗi ‘NN..NN’ là class sid của COM object bị thiếu). Khi đó, phần việc còn lại rất đơn giản: định vị class sid đó trong registry của máy tính đang chạy tốt để tìm ra đường dẫn đến cấu phần bị thiếu rồi sao chép (nếu cần) và dùng lệnh regsvr32 để đăng ký. Trong một số trường hợp đặc biệt, nguyên nhân có thể là thiếu quyền truy cập registry. Khi đó, người dùng sẽ thấy lỗi ACCESS DENIED ở thao tác đọc registry trong log do Process Monitor ghi lại. Với tình huống này, người dùng cần đăng nhập với tài khoản có quyền quản trị để phân quyền bổ sung cho tài khoản dùng để chạy ứng dụng.

    Nguyễn Anh Tuấn
    nguyen_anh_tuan@yahoo.com

    ID: A1003_94