• Chủ Nhật, 21/12/2003 17:12 (GMT+7)

    Câu hỏi :
    Em có đoạn mã VB sau dùng để mở 1 tập tin nào đó bằng ứng dụng tương ứng đã được đăng ký trong Registry Windows, giống như click vào file *.doc thì Word sẽ chạy, nhưng khi tạo module và cho thực thi thì nó chạy không đúng. Xin hướng dẫn để có thể truy xuất nó từ trang Web viết bằng ASP với tham số là đường dẫn chứa tập tin cần thi hành. Option Explicit ‘ Khai báo các hàm API cần gọi Private Declare Function RegCloseKey Lib “advapi32.dll” ( ByVal hKey As Long) As Long Private Declare Function RegOpenKey Lib “advapi32.dll” alias “RegOpenKeyA” ( ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Public Declare Function RegQueryValue Lib “advapi32.dll” Alias “RegQueryValueA” ( _ ByVal hKey As Long, _ ByVal lpSubKey As String, _ ByVal lpValue As String, _ lpcbValue As Long) As Long Private Declare Function RegQueryValueEx Lib “advapi32.dll” Alias “RegQueryValueExA” ( _ ByVal hKey As Long, _ ByVal lpValueName As String, _ ByVal lpReserved As Long, _ lpType As Long, _ lpData As Any, lpcbData As Long) As Long Private Declare Function WinExec Lib “kernel32” ( _ ByVal lpCmdLine As String, _ ByVal nCmdShow As Long) As Long Private Const MAX_PATH = 260 Private Const HKEY_CLASSES_ROOT = &H80000000 Private Const ERROR_SUCCESS = 0& Private Const REG_DWORD = 4 Private Const REG_SZ = 1 Private Const SW_SHOWNORMAL = 1 ‘Chương trình chính Private Sub Main() Dim strFile As String, strExten As String Dim strProgID As String, strExe As String Dim lPos As Long Dim hKey As Long, lStrLen As Long strFile = InputBox(“Enter Name of File “ & “to Open: “, “Open File”, “”) If strFile = “” Then Exit Sub ‘ Tìm phần nới rộng của tên file lPos = InStrRev(strFile, “.”) If lPos = 0 Then MsgBox “Filename must include an extension.” Exit Sub Else strExten = Mid(strFile, lPos) End If ‘ Tìm danh hiệu nhận dạng ứng dụng cần chạy If RegOpenKey(HKEY_CLASSES_ROOT, strExten, hKey) <> ERROR_SUCCESS Then MsgBox “File extension not found.” Exit Sub End If lStrLen = 0 Call RegQueryValue(hKey, “”, “”, lStrLen) strProgID = Space(lStrLen) Call RegQueryValue(hKey, “”, strProgID, lStrLen) RegCloseKey hKey ‘ Tìm đường dẫn ứng dụng cần chạy strProgID = Left(strProgID, lStrLen - 1) & “\shell\open\command” If RegOpenKey(HKEY_CLASSES_ROOT, strProgID, hKey) <> ERROR_SUCCESS Then MsgBox “Open command key not found...” Exit Sub End If lStrLen = 0 Call RegQueryValue(hKey, “”, “”, lStrLen) strExe = Space(lStrLen) Call RegQueryValue(hKey, “”, strExe, lStrLen) RegCloseKey hKey ‘ Chạy ứng dụng và truyền tham số cho nó là đường dẫn file dữ liệu lPos = InStr(1, strExe, “ %1”) If lPos > 0 Then _ strExe = Left(strExe, lPos) strExe = strExe & “ “ & strFile Call WinExec(strExe, SW_SHOWNORMAL) End Sub

    Trả lời :
     

    Ít ai có thể viết chương trình xong là chạy liền được, do đó sau khi viết xong source code cho 1 ứng dụng bạn cần phải kiểm lỗi (bằng cách debug) để tìm lỗi của ứng dụng và sửa chữa lại thì chương trình mới chạy đúng được. Cụ thể nếu bạn debug chương trình mà bạn liệt kê trong câu hỏi thì sẽ phát hiện lỗi ở lệnh xây dựng thông số strExe cho hàm WinExec (ở gần cuối chương trình). Thật vậy, giá trị lStrLen trả về từ hàm RegQueryValue() miêu tả độ dài của chuỗi văn bản theo qui định của ngôn ngữ C (nghĩa là kể cả byte 0 đánh dấu kết thúc chuỗi), do đó bạn phải giảm biến lStrLen đi 1 giá trị thì mới miêu tả đúng độ dài chuỗi thực sự. Tóm lại, bạn chỉ cần thêm 1 lệnh ở ngay sau hàng chú thích cuối cùng của chương trình là đủ, cụ thể đoạn code đã sửa như sau (phần sau chú thích cuối cùng của chương trình):

         ‘ Chạy ứng dụng và truyền tham số cho nó là đường dẫn file dữ liệu

         strExe = Left(strExe, lStrLen - 1)

         lPos = InStr(1, strExe, “ %1”)

         If lPos > 0 Then _

               strExe = Left(strExe, lPos)

         strExe = strExe & “ “ & strFile

         Call WinExec(strExe, SW_SHOWNORMAL)

    End Sub

    Ngoài ra nếu muốn đoạn chương trình trên có thể chạy trong trang Web, trước hết bạn phải cấu trúc lại nó để dịch thành 1 ActiveX Control (hay 1 thành phần COM) rồi nhúng nó vào trang Web cần sử dụng tính năng này. Trang Web có thể là trang HTML hay ASP đều được cả.

    Chuyên mục: Lập trình