Lỗi FM20.dll khó hiểu trong Office 64 bit

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,121
Được thích
24,279
Tôi đang nâng cấp dự án trong Office 64 bit. Tuy nhiên có 1 vấn đề là khi chạy chương trình luôn nhận được thông báo lỗi FM20.dll dù đã thử bản Office 2016, 2019 (đã update). Chương trình sử dụng control trong FM20.dll đó. Đương nhiên là fix xong thì chạy bình thường. Lỗi này xảy ra từ lâu nhưng Microsoft không sửa thì phải??? Với Office 32 bit thì không xảy ra tình trạng này.

FM20.jpg
 
Chương trình anh viết tring VBA hay ngôn ngữ nào?
 
Upvote 0
Cái này em nói lâu rồi. VB6 tạo ta EXE , DLL là 32 bit nên nó chỉ chạy cùng ứng dụng 32-bit. Nếu DLL tạo ra bởi VB6 chạy được với Office 64 bit thì nhiều người đã không phải khổ vì học ngôn ngữ và môi trường mới ít nhất chỉ vì vấn đề 64 bit.
 
Upvote 0
FM20.dll vẫn hoạt động bình thường trong Window 64 bit, Office 64 bit. Nhưng Microsoft không chịu đăng ký mà người dùng phải thao tác thủ công. Hay là họ cố tình nhỉ?
 
Upvote 0
FM20.dll vẫn hoạt động bình thường trong Window 64 bit, Office 64 bit. Nhưng Microsoft không chịu đăng ký mà người dùng phải thao tác thủ công. Hay là họ cố tình nhỉ?
Không phải như anh nghĩ. Là cái DLL của anh nó là 32 bit. Nó kéo quan hệ với các loại 32-bit. Khi DLL của anh chạy trong Office 64 bit thì cái nhóm có quan hệ với DLL 32 bit kia mặc nhiên không chạy được. Anh không quyết liệt chọn một môi trường mới để build 64 bit đi mà vẫn trong VB6 là không thể được đâu.
 
Upvote 0
Không phải như anh nghĩ. Là cái DLL của anh nó là 32 bit. Nó kéo quan hệ với các loại 32-bit. Khi DLL của anh chạy trong Office 64 bit thì cái nhóm có quan hệ với DLL 32 bit kia mặc nhiên không chạy được. Anh không quyết liệt chọn một môi trường mới để build 64 bit đi mà vẫn trong VB6 là không thể được đâu.

Làm được mà chú. Anh viết .net đã gần ổn rồi nhưng bị lỗi :( (AutoCAD bị, Office thì nuột luôn) nên tạm thời khắc phục bằng VB6, chạy exe (cũ dùng dll thì chỉ 32 bit thôi).VBNET.jpgVB6.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Anh viết .net thì tập trung rồi sẽ xong thôi. AutoCAD là ứng dụng Server Automation thì các ngôn ngữ hỗ trợ kiểu đối tượng Object/IDispatch đều làm được. Khi build exe, dll trên .net anh phải chú ý chọn platforms trùng với platform của AutoCAD, Office thì mới chuẩn.
 
Lần chỉnh sửa cuối:
Upvote 0
Anh nghĩ là VB.NET chắc được chứ em. Sao kỳ vậy ta.
Giờ các ngôn ngữ khác nó giúp việc làm việc với 32 và 64 dễ dàng hơn nhiều.
Lâu quá 3 anh em chưa gặp mặt nhỉ.

Lê Văn Duyệt
 
Upvote 0
VB6 nó không hổ trợ 64 bit.... nhưng Tôi vẫn viết cho nó chạy trên Office x64 bình thường mà ko cần thiết phải can thiệp abcdxyz gì hết ... rất đơn giản chỉ lách 1 chút là xài cho 32 bit và 64 bit chung 1 DLL


còn Delphi viết 32 bit thì chỉ chạy cho 32 bit ko thể 1 DLL mà chạy chung cho 32 bit và 64 bit hay là tôi chưa biết viết Delphi he
 
Upvote 0
VB6 nó không hổ trợ 64 bit.... nhưng Tôi vẫn viết cho nó chạy trên Office x64 bình thường mà ko cần thiết phải can thiệp abcdxyz gì hết ... rất đơn giản chỉ lách 1 chút là xài cho 32 bit và 64 bit chung 1 DLL


còn Delphi viết 32 bit thì chỉ chạy cho 32 bit ko thể 1 DLL mà chạy chung cho 32 bit và 64 bit hay là tôi chưa biết viết Delphi he

Bạn làm cho tôi một ví dụ nhỏ như sau nhé. Để tôi xem vấn đề bạn nói ứng dụng ở mức nào?
1. Tạo DLL ở VB6 mục đích dùng cho Office 64-bit. Trong DLL có một
Class clsMain, trong này tạo hai hàm
+ Function GetActiveHwnd() - Hàm này gọi hàm API của Windows "GetActiveWindow"
( Đây là khai báo hàm API bạn khai báo thế tùy chỉnh sao cho chạy được
Private Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long
)

+ Sub WriteValue(Byval rng As Excel.Range, Byval Value As Variant)
(Thủ tục này để ghi giá trị bất kỳ vào một ô hay vùng trong bảng tính Excel)

Bây giờ trong Excel:
Tôi sẽ nhúng DLL tạo từ VB6 ở trên
Chạy hàm GetActiveHwnd và thủ tục WriteValue
VÍ dụ trong module

Mã:
Sub TestVB6dll_Excel64bit()

      Dim cls As New clsMain

      'Hiển thị handle Window:

      MsgBox cls.GetActiveHwnd

     'Ghi giá trị vào ô A1

     WriteValue Range("A1"), "Alo!"

End Sub
 
Upvote 0
Bạn làm cho tôi một ví dụ nhỏ như sau nhé. Để tôi xem vấn đề bạn nói ứng dụng ở mức nào?
1. Tạo DLL ở VB6 mục đích dùng cho Office 64-bit. Trong DLL có một
Class clsMain, trong này tạo hai hàm
+ Function GetActiveHwnd() - Hàm này gọi hàm API của Windows "GetActiveWindow"
( Đây là khai báo hàm API bạn khai báo thế tùy chỉnh sao cho chạy được
Private Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long
)

+ Sub WriteValue(Byval rng As Excel.Range, Byval Value As Variant)
(Thủ tục này để ghi giá trị bất kỳ vào một ô hay vùng trong bảng tính Excel)

Bây giờ trong Excel:
Tôi sẽ nhúng DLL tạo từ VB6 ở trên
Chạy hàm GetActiveHwnd và thủ tục WriteValue
VÍ dụ trong module

Mã:
Sub TestVB6dll_Excel64bit()

      Dim cls As New clsMain

      'Hiển thị handle Window:

      MsgBox cls.GetActiveHwnd

     'Ghi giá trị vào ô A1

     WriteValue Range("A1"), "Alo!"

End Sub
1/ Link sau là cách thứ nhất chạy cho Officex64 và Officex32 ... đó là cách đơn giản nhất chạy chung cho Officex32 và x64

2/ Cách thứ 2 là
- 1 File *.dll viết = VB6
- Viết 1 File Load ( Tạm keo là Files Load ) dùng để load hàm trong Files *.dll viết = VB6
- Từ Excel ( không phân biệt Officex32 Or x64 ) check File Load xong cứ thế sử dụng hàm của File *.dll viết = VB6

Cách mục số 2 này an toàn hơn cách Mục số 1 ... tuy nhiên phát sinh thêm File Load

3/ File Load cũng được Viết = VB6 luôn
 
Lần chỉnh sửa cuối:
Upvote 0
1/ Link sau là cách thứ nhất chạy cho Officex64 và Officex32 ... đó là cách đơn giản nhất chạy chung cho Officex32 và x64

2/ Cách thứ 2 là
- 1 File *.dll viết = VB6
- Viết 1 File Load ( Tạm keo là Files Load ) dùng để load hàm trong Files *.dll viết = VB6
- Từ Excel ( không phân biệt Officex32 Or x64 ) check File Load xong cứ thế sử dụng hàm của File *.dll viết = VB6

Cách mục số 2 này an toàn hơn cách Mục số 1 ... tuy nhiên phát sinh thêm File Load

Bạn cứ làm ví dụ của tôi đi. Nếu bận tôi đã gửi code tạo DLL theo yêu cầu trên trong VB6 rồi .Việc của bạn giúp tôi biết là có chạy được hay không trong Excel 64-bit là được.?
 

File đính kèm

  • dllvb6.zip
    6.3 KB · Đọc: 8
Upvote 0
Anh viết .net thì tập trung rồi sẽ xong thôi. AutoCAD là ứng dụng Server Automation thì các ngôn ngữ hỗ trợ kiểu đối tượng Object/IDispatch đều làm được. Khi build exe, dll trên .net anh phải chú ý chọn platforms trùng với platform của AutoCAD, Office thì mới chuẩn.

Bên AutoCAD nó là AUTOCAD.NET. Nó có 1 số quy định rất củ chuối, phần lớn thủ tục tạo Object hay xử lý thông tin nó không khoa học, tuần tự như VB6, hay VBA (không kế thừa như với Office). Tôi nghĩ kiểu như cố ép vào. Và không hỗ trợ late binding...

Hóng tiếp các cao thủ bàn dll 64bit trong VB6.
 
Upvote 0
Bạn cứ làm ví dụ của tôi đi. Nếu bận tôi đã gửi code tạo DLL theo yêu cầu trên trong VB6 rồi .Việc của bạn giúp tôi biết là có chạy được hay không trong Excel 64-bit là được.?
Tự tay thử đi ... đó là cách Load DLL viết = VB6

1/ Nhớ đăng Ký File *.dll viết = VB6
2/ Nhớ đăng Ký File Register_VBLibraryLoad.EXE.vbs cho File VBLibraryLoad.exe
3/ xem code VBA
4/ Thưởng thức
 

File đính kèm

  • dllvb6.rar
    19.9 KB · Đọc: 8
Upvote 0
Bên AutoCAD nó là AUTOCAD.NET. Nó có 1 số quy định rất củ chuối, phần lớn thủ tục tạo Object hay xử lý thông tin nó không khoa học, tuần tự như VB6, hay VBA (không kế thừa như với Office). Tôi nghĩ kiểu như cố ép vào. Và không hỗ trợ late binding...

Hóng tiếp các cao thủ bàn dll 64bit trong VB6.

Anh đừng hy vọng DLL trong vb6 chạy được trong Ofice 64-bit một cách bình thường. SAI VỀ BẢN CHẤT VÀ NGUYÊN LÝ HOẠT ĐỘNG CỦA PLATFORM. Cả thế giớI dân lập trình VB6 phải dừng dự án cũ để thay thế trên ngôn ngữ khác. Vấn đề em đang hỏi phía trên là để xem cơ chế hoạt động ở dạng nào mà thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Tự tay thử đi ... đó là cách Load DLL viết = VB6

1/ Nhớ đăng Ký File *.dll viết = VB6
2/ Nhớ đăng Ký File Register_VBLibraryLoad.EXE.vbs cho File VBLibraryLoad.exe
3/ xem code VBA
4/ Thưởng thức

Kết quả test:
1. Hàm GetActiveHwnd trả về 0 => Sai


Nếu tình huống của hàm này không khắc phục được thì đó là lỗi nghiêm trọng nhiều ứng dụng có khả năng rất cao sẽ không thể dùng được phương pháp này khi nhúng các DLL, OCX khác vào VB6.

2. Thủ tục ghi dữ liệu vào vùng chạy được.

(*) Nếu hàm GetActiveHwnd() fix được, tôi sẽ làm ví dụ test tiếp
1. Tạo DLL sử dùng các Form, control của VB6
2. Tạo DLL sử dụng activex controsl chuẩn của Microsoft "MSCOMCTL.OCX"
3. Tạo COM Add-in để tự gọi khi mở Excel.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom