Tìm tên object khi sử dụng later binding

Liên hệ QC

huhumalu

Thành viên tiêu biểu
Tham gia
20/10/09
Bài viết
613
Được thích
512
Cho em hỏi về cách thức tìm tên của đối tượng (phần mền) khi sử dụng kết nối binding
Thông thường mình dùng
PHP:
set myObj = CreateObject("xxxx.yyyyy")
kiểu như
PHP:
set myObj = CreateObject("Excel.Application")
vấn đề em muốn hỏi làm sao mình biết đó là "Excel.Application" hay bằng cách nào, phần mềm thứ 3, để mình tìm ra tên này (bỏ qua cách đọc trong tài liệu hoặc chỉ dẫn hoặc trong tài liệu API chỉ hướng dẫn early binding).
Cảm ơn.
 
Những cái này do các server COM / Automation đăng ký trong system. Khi đó mọi thông tin sẽ được lưu trong cơ sở dữ liệu của system, đó là REGISTRY.
Phải đọc tài liệu hoặc bài viết của những người đi trước thôi. Không đọc thì làm sao biết là "cái này" dùng làm gì, và cách sử dụng ra sao.
Vd. bạn mở regedit.exe và cuộn cuộn xem chơi thì bạn bắt gặp "Scripting.Dictionary"

1.png

2.png

Bạn sẽ biết là có cái gọi là Scripting.Dictionary và nó do thư viện scrrun.dll tạo. Nhưng nếu không đọc bất cứ tài liệu nào thì làm sao bạn biết mặt mũi nó như thế nào, dùng làm gì, và cách dùng như thế nào?

Chính vì thông tin được lưu trong REGISTRY nên khi bạn viết Set a = CreateObject("Scripting.Dictionary") thì system biết ngay là do server scrrun.dll tạo và ngay lập tức gọi nó lên bảng, à không tới cơ quan, bắt nó tạo đối tượng rồi dâng cho bạn.
 
Trước hết, cần chỉnh lại"
Từ Later Binding dùng ở đây là không đúng. Later có nghĩa là "để nối sau".

Code muốn gọi hàm thư viện hay các class/objects từ thư viện thì phải có cách kết nối với chúng.

Trong cách kết nối với hàm/class/object, người ta có hai từ ngữ là "late binding" và "early binding".
Early binding là compiler biết class/object rõ ràng và bày biện ra đủ các trình tự cần thiết để kết nối rõ ràng ngay khi code vừa gõ xong. Tức là các objects mà code VBA đã biết khi người viết code có tích chúng trong thư viện Reference.
Late binding có nghĩa là compiler chưa biết class/object mà code cần kết nối. Phải đến lúc chạy code mới biết và đến lúc đó mới mò đến các nơi cung ứng (servers) để hỏi thăm, xin trình tự kết nối, và thực hiện kết nối.
Đây là nói cho các COM, APIx của Windows. Late bindings ở các ngôn ngữ khác hoạt động hơi khác một chút. Nhưng chung quy, từ "late binding" là trường hợp compiler không biết ngay lúc khai báo, phải đợi đến lúc chạy code đến đúng đoạn dựng object hay thậm chí lúc sử dụng mới biết.

Trong tiêu đề thì bạn hỏi "tên" (identifier/ tức variable name) của object. Nhưng qua câu hỏi tôi đoán là bạn muốn tìm kiểu (type). Hàm Typename cho phép bạn làm việc này.
 
Dạ, cảm ơn hai anh, để em tìm hiểu thêm.
 
Thế ý của bạn trong bài #1 là gì? Bạn có thể nói rõ được không? Đừng nói với tôi là bạn không biết giải thích nhé.
Dạ, em đang đọc tài liệu, họ có hướng dẫn
1655890484225.png
Em thì mong muốn file mình chạy trên cả máy ở nhà hay công ty, không cần phải làm lại động tác (1) Tools menu > References rồi chọn thư viện *.dll hoặc *.tlb
Nên em đang định tìm cái tên đề dùng như kiểu
Set MyDictionary = CreateObject("Scripting.Dictionary") thay vì chọn thư viện Microsoft Scripting Runtime trong References
mà giờ muốn gọi đúng cái tên tương ứng với cái *.dll, *.tlb kia.
Thực tế thì em cũng tìm thấy trong tài liệu là "CSI.SAP2000.API.SapObject" nhưng vẫn muốn hiểu rõ cách thức tìm ra tên này ạ.
 
Thực tế thì em cũng tìm thấy trong tài liệu là "CSI.SAP2000.API.SapObject" nhưng vẫn muốn hiểu rõ cách thức tìm ra tên này ạ.

Chỉ có thể lấy từ tài liệu hướng dẫn của chủ thể tạo ra cái đối tượng đó mà thôi.

Bởi cái đó chỉ là cái tên, người ta có thể đặt là "Gioi_oi.Dat_hoi" cũng được.
 
Dạ, em đang đọc tài liệu, họ có hướng dẫn
View attachment 277750
Em thì mong muốn file mình chạy trên cả máy ở nhà hay công ty, không cần phải làm lại động tác (1) Tools menu > References rồi chọn thư viện *.dll hoặc *.tlb
Nên em đang định tìm cái tên đề dùng như kiểu
Set MyDictionary = CreateObject("Scripting.Dictionary") thay vì chọn thư viện Microsoft Scripting Runtime trong References
mà giờ muốn gọi đúng cái tên tương ứng với cái *.dll, *.tlb kia.
Thực tế thì em cũng tìm thấy trong tài liệu là "CSI.SAP2000.API.SapObject" nhưng vẫn muốn hiểu rõ cách thức tìm ra tên này ạ.
Bạn kiếm mấy cái code đăng ký tự động thư viện khi khởi động ứng đụng và bỏ đăng ký khi thoát ứng dụng.
Còn muốn xem tên các đối tượng, phương thức, thuộc tính từ thư việc mới đăng ký thì cứ vô Object Browser mà tìm.
 
Lần chỉnh sửa cuối:
Dạ, em đang đọc tài liệu, họ có hướng dẫn
View attachment 277750
Em thì mong muốn file mình chạy trên cả máy ở nhà hay công ty, không cần phải làm lại động tác (1) Tools menu > References rồi chọn thư viện *.dll hoặc *.tlb
Nên em đang định tìm cái tên đề dùng như kiểu
Set MyDictionary = CreateObject("Scripting.Dictionary") thay vì chọn thư viện Microsoft Scripting Runtime trong References
mà giờ muốn gọi đúng cái tên tương ứng với cái *.dll, *.tlb kia.
Thực tế thì em cũng tìm thấy trong tài liệu là "CSI.SAP2000.API.SapObject" nhưng vẫn muốn hiểu rõ cách thức tìm ra tên này ạ.
Thì tôi biết là bạn muốn kết nối chậm mà. Nhưng ý tôi là bạn muốn biết đó là "Scripting.Dictionary" chứ không phải "Script.Dictionary", không phải "Scripting.Dictionaries", không phải "Scripting.Dict", đúng không?

Nếu ý là thế thì tôi đã viết rồi. Tất cả các lớp được đăng ký thì thông tin được ghi trong REGISTRY và có thể xem nếu bạn cṕ thời gian rỗi. Chỉ có điều bạn không thể biết "Scripting.Dictionary" làm gì, "Scripting.FileSystemObject" v...v làm gì. Phải đọc tài liệu như tôi viết. Nếu ý không là thế thì thôi, coi như tôi không hiểu ý bạn.

Tôi hỏi lại vì nếu bạn đã biết rõ là phải Set MyDictionary = CreateObject("Scripting.Dictionary") thì cũng biết ngay là tên lớp là Dictionary rồi chứ đâu cần tới TypeName.

Nếu không đọc tài liệu thì làm sao bạn biết cái mà bạn cần làm nó tên là gì? Tôi lập trình trong Delphi thì tôi cũng có thể tự viết một server COM, tạo và cung cấp một số đối tượng. Tôi có thể đăng ký trong system và mỗi người có thư viện của tôi họ có thể kích hoạt để đăng ký trong system của họ. Và họ đọc tài liệu của tôi để biết cách dùng. Bạn không đọc tài liệu của tôi thì làm sao bạn biết tôi có cái bạn cần, và nó tên là gì, cách sử dụng ra sao?
 
Lần chỉnh sửa cuối:
Nếu các Objects là các phần tử thuộc về một collection, hoặc một array gì đó thì có thể sau khi code chạy một hồi người ta cần xem lại phần tử nào đó là loại object gì. Và trường hợp này thì TypeName có thể được sử dụng:

Nếu collection là lấy từ một lần gọi hàm, sub nào đó để fill nó thì rất có thể bên hàm gọi không biết chúng là gì.

For Each Ctl In CtlColl
Select Case TypeName(Ctl)
Case "ClassModuleX"
...
Case "ClassModuleY"
...
End Select
Next Ctl

Đối với LTHĐT, việc hỏi lại xem Object lấy ra từ collection là kiểu gì cũng khá thường xuyên. Tuy rằng để cho nó tự biến hình thì vẫn đẹp hơn.
 
Những cái này do các server COM / Automation đăng ký trong system. Khi đó mọi thông tin sẽ được lưu trong cơ sở dữ liệu của system, đó là REGISTRY.
Phải đọc tài liệu hoặc bài viết của những người đi trước thôi. Không đọc thì làm sao biết là "cái này" dùng làm gì, và cách sử dụng ra sao.
Vd. bạn mở regedit.exe và cuộn cuộn xem chơi thì bạn bắt gặp "Scripting.Dictionary"

View attachment 277701

View attachment 277702

Bạn sẽ biết là có cái gọi là Scripting.Dictionary và nó do thư viện scrrun.dll tạo. Nhưng nếu không đọc bất cứ tài liệu nào thì làm sao bạn biết mặt mũi nó như thế nào, dùng làm gì, và cách dùng như thế nào?

Chính vì thông tin được lưu trong REGISTRY nên khi bạn viết Set a = CreateObject("Scripting.Dictionary") thì system biết ngay là do server scrrun.dll tạo và ngay lập tức gọi nó lên bảng, à không tới cơ quan, bắt nó tạo đối tượng rồi dâng cho bạn.
Em chào anh cùng với mọi người đã tham gia vào chủ đề này .
Em cũng có một câu hỏi liên quan đến vấn đề anh nói và muốn hỏi ké :> . Tại em khi đọc tài liệu thì có mấy chỗ không hiểu mà không thể nào đặt được vấn đề (kiểu chỉ cảm nhận được thôi chứ nó không rõ ràng hay không biết nó có phải là vấn đề hay là không hoặc không biết nó là cái gì để tìm kiếm).
Ở đây em muốn lấy một ví dụ để cho dễ giải thích
Trong module 2 (sub CopyFromExcelDatabaseLateBinding) . Mục đích của sub này là lấy dữ liệu từ bảng "SalesOrders" trong Sheet1 rồi điền vào Sheet có thên là"hello" được tạo sau đó .

1655898465838.png
Như các anh chị thấy là cái lúc đặt giá trị cho các Object như OrderConn hoặc OrderData ở chỗ khoanh đỏ thì không hề có từ khóa Server
Nhưng lúc em đọc về thuộc tính LockType của đối tượng RecordSet trong tài liệu ADO của trang w3school (https://www.w3schools.com/asp/prop_rs_locktype.asp#LockTypeEnum) chẳng hạn hay các bài khác cũng thế
thì nó đề xuất hiện từ khóa Server:
1655898953095.png
Vậy cho em hỏi ý nghĩa của từ khóa này là thế nào mà nó có thể bỏ được ?(có thể cho em tài liệu để đọc) . Liệu nó có liên quan gì đến bài anh viết hay không ?
Liệu cái em khoanh màu xanh như sau có liên quan gì đến vấn đề này không ?
1655899061155.png
 

File đính kèm

  • ADBO.xlsm
    42 KB · Đọc: 3
Lần chỉnh sửa cuối:
Như các anh chị thấy là cái lúc đặt giá trị cho các Object như OrderConn hoặc OrderData ở chỗ khoanh đỏ thì không hề có từ khóa Server
Nhưng lúc em đọc về thuộc tính LockType của đối tượng RecordSet trong tài liệu ADO của trang w3school (https://www.w3schools.com/asp/prop_rs_locktype.asp#LockTypeEnum) chẳng hạn hay các bài khác cũng thế
thì nó đề xuất hiện từ khóa Server:
Bạn đang dùng VBA mà, server gì ở đây.. Trong VBA có hàm CreateObject. Bạn có thể dùng CreateObject("...") hoặc tường minh là VBA.CreateObject("..."). Còn thằng VBA.CreateObject nó gọi cái gì kệ nó đi. Miễn là kết quả có đối tượng để nhập vào (ghi nhớ) trong OrderConn hoặc OrderData là được.

Cái trang mà bạn đọc (ASP Tutorials) nó đâu có cung cấp cho bạn code với cú pháp của VBA đâu.

menu View ->Obect Browser

vba.png

chọn thư viện VBA -> duyệt tới và chọn CreateObject -> nhấn dấu ?

create.png

Nhìn hình làm gì còn cái gọi là SERVER nữa.
 
Lần chỉnh sửa cuối:
Bạn lầm lẫn giữa chương trình chạy trên máy và chương trình chạy qua web rồi.

ASP là một địa bàn của Windows Web Server. Mà cái đó cũ rồi. Bi giờ người ta dùng ASPX.

Một trang ASP có thể được viết bằng VBScript, JScript (JavaScript, Windows flavour), hay bằng VB Dot Net, C#.
 
Dạ vâng ạ ! Em cảm ơn hai anh nhiều . Cảm ơn hai anh đã đọc và xem giùm em ^^
Thế là tự dưng phí cả buổi chiều mất làm mấy thứ linh tinh :< Thật là không thể tin nổi ! Mất công quá đi :<
 
Thì tôi biết là bạn muốn kết nối chậm mà. Nhưng ý tôi là bạn muốn biết đó là "Scripting.Dictionary" chứ không phải "Script.Dictionary", không phải "Scripting.Dictionaries", không phải "Scripting.Dict", đúng không?
--> Dạ chính xác ý này ạ. Đúng là phải đọc thì mới biết được.
Cảm ơn các anh, bữa giờ em cũng đủ chuyện nên "lặn sâu" giờ mới trả lời được ạ.
Phần này em đăng ký trước phần thư viện để thực hiện công việc trước đã, các phần ứng dụng điều chỉnh thuận tiện thì để sau.
 
Web KT
Back
Top Bottom