AI muốn lập trình DLL cho Excel và các loại bằng Delphi thì xem video này nhé!

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,652
Được thích
10,140
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Hihihi Cuối cùng bắt trước 2 anh cũng xong hàm TypeName mới
 
Upvote 0
giờ mới rảnh 1 tẹo Copy code bài 920 thử Build 1 cái thì nó báo lỗi dòng sau:
Với trình của Mạnh thời điểm hiện tại code đó chỉ biết Copy mà xài chứ còn đọc hiểu và chỉnh sửa là điều ko thể ...
may ra sau này thì có thể chăng !!

phát sinh cái IDispatch lại bắt đầu mò tài liệu coi nó là cái chi .... mò diết sau này hệ thống lại kiến thức may ra mới có cái nhìn bao trùm và hiểu cơ bản được ;):p
Mã:
if v^.vt and varTypeMask = VT_DISPATCH then
  begin
    if v^.vt and varByRef <>0 then
      Disp := IDispatch(v^.dispVal^) //Lỗi dòng này
    else
      Disp := IDispatch(v^.dispVal);
    if Disp = nil then
      s := 'Nothing' //from "rờ e" by TQN
    else
Capture.JPG
Bài đã được tự động gộp:

Hihihi Cuối cùng bắt trước 2 anh cũng xong hàm TypeName mới
Code TCA Mạnh sửa lại dòng này hoài ko xong ... sửa lại dùm đi
Mã:
if Failed(pDisp.QueryInterface(IID_IProvideClassInfo, pProvideClassInfo) then
Chậm hiểu quá he
 
Lần chỉnh sửa cuối:
Upvote 0
thì đó .... sửa lại code TCA cho mạnh với ....??
Mã:
  //v: OleVariant
  if PVariantArg(@v).vt and varTypeMask = VT_DISPATCH then
  begin
    if PVariantArg(@v).vt and varByRef <>0 then
      Disp := IDispatch(PVariantArg(@v).dispVal^)
    else
      Disp := IDispatch(PVariantArg(@v).dispVal);
Bài đã được tự động gộp:

Tóm lại là anh muốn Sửa code của ai
223336
 

File đính kèm

  • 1111.png
    1111.png
    133 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Mã:
  //v: OleVariant
  if PVariantArg(@v).vt and varTypeMask = VT_DISPATCH then
  begin
    if PVariantArg(@v).vt and varByRef <>0 then
      Disp := IDispatch(PVariantArg(@v).dispVal^)
    else
      Disp := IDispatch(PVariantArg(@v).dispVal);
Bài đã được tự động gộp:

Tóm lại là anh muốn Sửa code của ai
Cả 2 đi
 
Upvote 0
Cả hai code đều có lỗi nghiêm trọng, tui chỉ nghĩ trong đầu mà code và chưa kiểm tra mã máy sinh ra. Khi phát hiện ra vấn đề thì dịch mã máy file dll của bác Tuân thì ngã ngữa. Tính để im mà thôi thấy vậy không được, do cũng từ mình mà ra. Lỗi này do cả 3, Delphi coder, Delphi compiler và sự khác nhau rất tinh tế của mã máy ASM của VC++ và Delphi.
Nhiều trường hợp, object được call TypeName sẽ không Release đúng, nên Reference Count vẫn dương. Khi Excel thoát thì nó thoát không được, phải chờ hoài forever.
Do mình code C/C++ với pointer quen rồi, chỉ 1 - 1 với mã máy, chứ có ngờ đâu ông Delphi ổng lanh chanh im lặng làm hậu trường quá nhiều vậy, AddRef, Release lung tung. Có cái ép kiểu thôi cũng sinh mã call AddRef thằng bị ép. Thoát khỏi hàm thì IntfClear 1 mớ nữa, chết là phải.
 
Lần chỉnh sửa cuối:
Upvote 0
Cả hai code đều có lỗi nghiêm trọng, tui chỉ nghĩ trong đầu mà code và chưa kiểm tra mã máy sinh ra. Khi phát hiện ra vấn đề thì dịch mã máy file dll của bác Tuân thì ngã ngữa. Tính để im mà thôi thấy vậy không được, do cũng từ mình mà ra. Lỗi này do cả 3, Delphi coder, Delphi compiler và sự khác nhau rất tinh tế của mã máy ASM của VC++ và Delphi.
Nhiều trường hợp, object được call TypeName sẽ không Release đúng, nên Reference Count vẫn dương. Khi Excel thoát thì nó thoát không được, phải chờ hoài forever.
Do mình code C/C++ với pointer quen rồi, chỉ 1 - 1 với mã máy, chứ có ngờ đâu ông Delphi ổng lanh chanh im lặng làm hậu trường quá nhiều vậy, AddRef, Release lung tung. Có cái ép kiểu thôi cũng sinh mã call AddRef thằng bị ép. Thoát khỏi hàm thì IntfClear 1 mớ nữa, chết là phải.

Có một số dự án khác em làm thì kiểm tra Delphi tự Repease object, khi ép kiểu nó addRef nên có một số code tự viết lớp IMyDispatch.AddRef(+2), IMyDispatch.Release(-1) tính thằng Delphi nó "trừ hộ" 1 là hòa. Ví dụ MyTypeName vừa em em chỉ code theo đúng cách làm ngôn ngữ, và không xử lý lại việc này. Vì thế cái đoạn:
if ProviderClassInfor <> nil then
//ProviderClassInfor._Release; //crash Excel

Phải comment khóa đoạn đúng ra phải release. Thấy nó vô lý và cứ treo đó để tính sau đấy anh :).
 
Upvote 0
Vì vậy mà anh test nó bị treo Excel khi thoát đó em, không biết trong trường hợp nào.
Còn tin vui là BSTR mà chúng ta SysAllocString dạng ANSI đánh lừa trả về, VBA nó free cho ta = SysFreeString, khỏi sợ leak memory :)
Hì hì lanh chanh MultiByteToWideChar thì ta cho mày MultiByte để convert cho thỏa luôn :p
 
Upvote 0
Lúc đầu anh tính cố tình đánh lừa nó bằng cách đẩy biến AnsiString về cho nó đó chứ, vì kiểu AnsiString cũng có 4 byte len đằng trước. Nhưng sau nếu nó SysFreeString thì không an toàn, thôi cứ cấp SysAllocString giả cho nó.
 
Upvote 0
Vì vậy mà anh test nó bị treo Excel khi thoát đó em, không biết trong trường hợp nào.
Còn tin vui là BSTR mà chúng ta SysAllocString dạng ANSI đánh lừa trả về, VBA nó free cho ta = SysFreeString, khỏi sợ leak memory :)
Hì hì lanh chanh MultiByteToWideChar thì ta cho mày MultiByte để convert cho thỏa luôn :p

Viết hàm cho VBA thì như vậy là "vô tư" dùng không lo leak memory. Tuy nhiên những hàm dạng này nếu dùng lẫn trong Delphi thì Delphi Coder phải nhớ mà SysFreeString không thì leak. Delphi lại không tự free loại này !/?.
 
Upvote 0
Cho nên lúc trước vụ rtcTypeName trong Delphi, mình đã nói @thuyyeu99 là dùng sẽ bị leak memory mà, lúc đó ai hiểu đâu :)
 
Upvote 0
Đã nói là hàm có lỗi nghiêm trọng mà vẫn còn ráng dùng.
 
Upvote 0
kiểu buông 1 câu lưng trừng trời vậy nhiều lúc thấy vừa bực mà vừa vui .... càng kiếm ta kiên trì mò thui
 
Upvote 0
Upvote 0
Lỗi này cậu fix không được đâu. Phải debug vào mã máy của Delphi đấy.
 
Upvote 0
Cứ nghĩ nó có 2 dòng sau nên nó cứ build là nó lỗi link tinh hết
Winapi.ActiveX,
System.Variants;
 
Upvote 0
Web KT
Back
Top Bottom