Kĩ thuật lập trình VBA đa nền tảng và lập trình tương tác Window

  • Thread starter Thread starter HeSanbi
  • Ngày gửi Ngày gửi
Liên hệ QC

HeSanbi

Nam Nhân✨Hiếu Lễ Nghĩa Trí Tín✨
Tham gia
24/2/13
Bài viết
2,697
Được thích
4,252
Giới tính
Nam
Hôm nay tôi tạo ra bài viết này vì thấy đa số các bạn biết đến VBA (Microsoft Visual Basic for Application) hay mơ hồ về khai báo tiền xử lý như dấu "#" , Win64, Win32, Win16, VBA7, Mac và các khai báo tương thích ngược về nền tảng thấp Window 32bit thì phải có PtrSafe, các khai báo kiểu biến như LongPtr, LongLong, Any. (LongPtr là kiểu biến tương thích)
Các thuộc tính tương thích như HinstancePtr thay cho Hinstance, ...
Như thế nào là? Các hàm tương thích: StrPtr, VarPtr, ObjPtr

Các bạn hãy đọc sơ qua bài viết của tôi để nắm rõ hơn:


1. Kĩ thuật lập trình đa nền tảng:
+ Tiền xử lí:
Dấu thăng (#) sẽ ám chỉ đoạn code nằm trong block này chính là tiền xử lý, và các đoạn code này sẽ được trình biên dịch đọc trước tiên.
Đoạn code chỉ được biên dịch khi nằm trong Block đủ điều kiện.

JavaScript:
'Ví dụ Đặt một biến để khóa ứng dụng là Excel để code chỉ hoạt động khi ứng dụng là Excel:
#Const App = "Microsoft Excel" ' Word / Access
'Thực tế là Application.Name
'Và xử dụng nó trong block
#If App = "Microsoft Excel" Then

#Else
    'Phần code ở đây sẽ không được biên dịch
#End If

'Sử dụng nó trong một thủ tục
Sub Test()
    #If App = "Microsoft Excel" Then

    #Else
         'Phần code ở đây sẽ không được biên dịch
    #End If
End Sub


Khai báo tương thích ngược giữa Win64, Office 64, Win 32, Office 32:

JavaScript:
'Tiền xử lý'
'Ta sẽ khai báo hàm và thêm PtrSafe trong block đủ điều kiện là VBA7  (Trong block VBA7 - sẽ cho cả Win64 và Win32)
'Các khai báo Enum và Type cũng phải xác định rõ ràng trong các Block tiền xử lí.

#If Mac Then
    'Khai báo cho Office hoạt động trên MacOS'
    'Office cho Mac ra đời sau nên chỉ có phiên bản VBA7
#Else
    'Window'
    #If VBA7 Then
        'Office 2010 cho đến nay, vì sự xuất hiện của "Con trỏ trỏ vào trong một vùng nhớ System".

       'Ràng buộc Win64:
       ' Nếu một biến của hàm Win API khác nhận kiểu biến lớn hơn tức là LongPtr / LongLong /  Any  ( LongPtr - tương thích)
        #If Win64 Then
             '...PtrSafe ...() As LongPtr ' LongLong /  Any
        #Else
            '...PtrSafe ...() As Long
        #End if

    #Else 'Office <=2007  và có cả Win32 , Office32

    #End If
#End If

'Khởi tạo biến:

#If VBA7 Then
    Public A as LongPtr '/LongLong 'Không có Any - Any chỉ dành cho tiền xử lý gồm hàm Win32 và các hàm dựng
#Else
    Public A as Long
#End if

'Khởi tạo Thủ tục Cách thứ nhất:'
#If VBA7 Then
    Function Test() as LongPtr '/LongLong  ' No Any
        A = Application.HinstancePtr
#Else
    Function Test() as Long
        A = Application.Hinstance
#End if
        Test = A
End Function
'Click Debug Compiler trong VBA Ediot để soát lỗi'

'Khởi tạo Thủ tục Cách thứ hai:'
#If VBA7 Then
    Function Test() as LongPtr '/LongLong ' No Any
        'Tính tương thích ngược với win32 ở win64 và office64'
        '*Thêm: Khởi tạo biến tương thích
        #If Win64 Then
            Dim B As LongLong
        #Else
            Dim B As Long
        #End If
        B = Application.HinstancePtr
        A = B
        Test = A
    End Function
#Else
    Function Test() as Long
        A = Application.Hinstance
        Test = A
    End Function
#End If
'Nếu hàm là một hàm nhập vào biến của hàm Win API nhận kiểu biến lớn hơn Long:
#If VBA7 or Win64 Then
    Function Test() as LongPtr '/LongLong
           Dim B As LongLong
           Test = B
    End Function
#Else
    Function Test() as Long
        A = Application.Hinstance
        Test = A
    End Function
#End If

Bảng xác định các nền tảng tương thích:

capture-png.218407


Xem tính tương thích giữa các nền tảng

Xem tài liệu VBA

Để lập trình tương thích trong VBA cần các công cụ để xem các hàm trong Win API:
Tải về Windows API Viewer để xem các hàm tương thích ngược: Link 1 , Link 2

*Lưu ý: Phương pháp lập trình cho Window Version lỗi thời sẽ không đề cập ở đây.

+ Callback Function trong VBA:
Callback Function (là hàm thực thi của hàm khác)
thường được gọi khi các Hàm Dựng hoặc hàm Win API thực thi.
Nếu các bạn đã biết khai báo Byref trong VBA thì sẽ dể hiểu hơn ở hàm Callback. Nó cũng sẽ trả lại các đối số với các giá trị đã được gán.

Ví dụ:
JavaScript:
#If VBA7 Or Win64 Then
    Public Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal HMod As LongPtr, ByVal dwThreadId As Long) As LongPtr
#Else
    Public Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal HMod As Long, ByVal dwThreadId As Long) As Long
#End If
'lpfn sẽ nhận một Hàm thực thi
SetWindowsHookEx(14, AddressOf Test, lngAppInst, 0&)
AddressOf sẽ gửi (trỏ) hàm Test đến một vùng nhớ, và để thực hiện gọi lại hàm sau này mà không cần phải thực thi lại toàn bộ hàm SetWindowsHookEx
Và Hàm test sẽ nhận lại các đối số nhận các giá trị được trả về từ AddressOf Test.
Function Test(*<Các đối số>)
End Function
Vì mã nguồn của các hàm WinAPI là mã đóng nên phải xem qua Docs Microsoft hướng dẫn .
Ví dụ xem các đối số trả về tại Docs Microsoft của hàm SetWindowsHookEx

2. lập trình tương tác Window:
Vì lập trình tương tác với Window cần am hiểu chuyên sâu về cấu trúc cũng như thông thạo ngôn ngữ lập trình nên dưới đây tôi chỉ gợi ý một số phương pháp để thực hiện.

+ Lập trình nhúng thư viện tự tạo với các ngôn ngữ lập trình khác như: Delphi, C++, C#, VB.NET, ...
+ Lập trình giao tiếp giữa VBA và ứng dụng khác thông qua PowerShell Window.
+ Các ứng dụng giúp lập trình VBA với Win32API tương tác với Window:

++ WMIGen.exeWMI Code Creator- Thu thập thông tin xử lý tác vụ window với WMI
++ Microsoft Spy++, Spy Sử dụng trong Visual Studio, Winspector hoặc WinSpy: Để thu thập các lớp, tên, tiến trình, lệnh thực thi ... trong System

++ Khai báo Hằng Hàm WinAPI : https://www.pinvoke.net/index.aspx

*Các ứng dụng trên trợ giúp hầu hết tất cả Ngôn ngữ lập trình để tương tác Window


Nếu cảm thấy bài viết bổ ích hãy click trả lời bài viết ! Chúc các bạn thành công
Tags: winapi, window api, win32 api, ptrsafe win64, system vba, longlong vba, longptr vba, ptrsafe vba, lập trình VBA đa nền tảng, win64, win32, tiền xử lý trong VBA, Callback Function VBA, office64, office32, tương tác ứng dụng

(Vì sao có Tags? Dành cho việc thực hiện tìm kiếm trong phần tìm kiếm, các từ khóa chính là sự móc nối, tỉ lệ tìm kiếm chính xác sẽ cao hơn)
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom