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,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
@thuyyeu99
Cho Mạnh hỏi chút khi lấy Path của File *.exe của Delphi thì như sau
Mã:
(ExtractFilePath(Application.ExeName)+'VD.xls');
Vậy Mạnh muốn hỏi lấy Path của File *.DLL ngay trong chính nó thì sao hay phải khai báo thủ công có đường dẫn Full:
VD: D:\nnn\kkk\Manh.DLL
 
Upvote 0
@thuyyeu99
Cho Mạnh hỏi chút khi lấy Path của File *.exe của Delphi thì như sau
Mã:
(ExtractFilePath(Application.ExeName)+'VD.xls');
Vậy Mạnh muốn hỏi lấy Path của File *.DLL ngay trong chính nó thì sao hay phải khai báo thủ công có đường dẫn Full:
VD: D:\nnn\kkk\Manh.DLL
Anh su dụng delphi máy 2010 hay xe
XE
Uses IWSystem
showmessage(gsAppPath);
 
Upvote 0
Upvote 0
Upvote 0
cái đó anh phải khai báo mà chứ Load vào đâu em chưa hiểu. nó khai báo giống như hàm Api mà ?
Mạnh Mô tả chi tiết vầy
1/ Có 2 cái DLL trong 1 Folder: A.dll và B.dll
2/ Từ Excel chạy A.dll và từ A.dll có load cái hàm trong B.dll khi khai báo như sao thì chạy tốt
Mã:
LibHandle := LoadLibrary('D:\MyDelphi_Dynamic_Link_Library\Win32\Debug\FormInDLL.dll')
3/ còn nếu khai báo lấy đường dẫn từ file A.dll xong ghép với File B.dll
khi ShowMessage thì thấy đường dẫn y trang như trên mà sao nó không load vào được

đã thử theo 2 cách sau mà không load được B.dll
Mã:
LibHandle := LoadLibrary(gsAppPath +'FormInDLL.dll'); //Cách 1
LibHandle := LoadLibrary(gsAppPath) + 'FormInDLL.dll';//Cách 2
Chắc nó chưa hiểu cái gì đó mà mình chua biết ???

Rảnh mò cái thư viện IWSystem ... mà Delphi nó cũng dấu luôn he :p ===\.

Capture.JPG
 
Lần chỉnh sửa cuối:
Upvote 0
Mạnh Mô tả chi tiết vầy
1/ Có 2 cái DLL trong 1 Folder: A.dll và B.dll
2/ Từ Excel chạy A.dll và từ A.dll có load cái hàm trong B.dll khi khai báo như sao thì chạy tốt
Mã:
LibHandle := LoadLibrary('D:\MyDelphi_Dynamic_Link_Library\Win32\Debug\FormInDLL.dll')
3/ còn nếu khai báo lấy đường dẫn từ file A.dll xong ghép với File B.dll
khi ShowMessage thì thấy đường dẫn y trang như trên mà sao nó không load vào được

đã thử theo 2 cách sau mà không load được B.dll
Mã:
LibHandle := LoadLibrary(gsAppPath +'FormInDLL.dll'); //Cách 1
LibHandle := LoadLibrary(gsAppPath) + 'FormInDLL.dll';//Cách 2
Chắc nó chưa hiểu cái gì đó mà mình chua biết ???

Rảnh mò cái thư viện IWSystem ... mà Delphi nó cũng dấu luôn he :p ===\.

View attachment 226178
Mà hình như anh còn thiếu dấu '\'
LibHandle := LoadLibrary(gsAppPath +'\FormInDLL.dll');
Cái này em nghĩ chac không khó đâu, còn không anh chép vô thư mục win hay cố định 1 thư mục nào đó chứ làm gì mà phải lấy lung tung đường dẫn
 
Lần chỉnh sửa cuối:
Upvote 0
Mà hình như anh còn thiếu dấu '/'
Cái này em nghĩ chac không khó đâu, còn không anh chép vô thư mục win hay cố định 1 thư mục nào đó chứ làm gì mà phải lấy lung tung đường dẫn
Biết là thế nếu cho vào folder System thì lại không hỏi ... đang tập tành liên kết các thư viện với nhau đó mà khi cần có thể xài ké cái thư viện của ai đó chẳng hạn )
đã coi hết rồi không thiếu cái dấu '/' đó mà sao nó không load ... có cái chi đó mà mình chưa hiểu hết đó thôi


Cho Mạnh hỏi thêm chút sao cái Delphi 10.2 của Mạnh cứ khoảng mấy giây là nó chớp chớp cái màn hình giao diện của nó là sao ... bất tiện quá đang viết code hay chỉnh sửa nó chớp chớp là khỏi làm luôn ... cách tắt nó đi sao ???
 
Lần chỉnh sửa cuối:
Upvote 0
Biết là thế nếu cho vào folder System thì lại không hỏi ... đang tập tành liên kết các thư viện với nhau đó mà khi cần có thể xài ké cái thư viện của ai đó chẳng hạn )
đã coi hết rồi không thiếu cái dấu '/' đó mà sao nó không load ... có cái chi đó mà mình chưa hiểu hết đó thôi


Cho Mạnh hỏi thêm chút sao cái Delphi 10.2 của Mạnh cứ khoảng mấy giây là nó chớp chớp cái màn hình giao diện của nó là sao ... bất tiện quá đang viết code hay chỉnh sửa nó chớp chớp là khỏi làm làm ... cách tắt nó đi sao ???
Bài đã được tự động gộp:

Mò hông ra thì nhờ các anh hỗ trợ chứ em có làm mấy cái này đâu hichic heheh
 
Lần chỉnh sửa cuối:
Upvote 0
Bài đã được tự động gộp:

Mò hông ra thì nhờ các anh hỗ trợ chứ em có làm mấy cái này đâu hichic heheh
oh đọc cái đó thì chép vào folder system cho rồi... đọc nhức đầu lắm
chỉ Mạnh cách tắt chớp chớp (nháy nháy liên tục ) trên IDE Delphi đi thấy bất tiện quá
 
Upvote 0
Bạn phải lưu ý khi chạy luồng 32 bit thì các dll cũng phải 32 và 64 cũng thế. Việc gọi dll trong thư mục hệ thống hay thư mục ngoài của dll không khác nhau gì cả.
 
Upvote 0
oh đọc cái đó thì chép vào folder system cho rồi... đọc nhức đầu lắm
chỉ Mạnh cách tắt chớp chớp (nháy nháy liên tục ) trên IDE Delphi đi thấy bất tiện quá
Cái này win 7 em không thấy bị chỉ bị win 10. Em không biết bị gì nữa.

Em còn đang dính cái lỗi 217 build dll mà chưa mò ra nè
 
Upvote 0
Bạn phải lưu ý khi chạy luồng 32 bit thì các dll cũng phải 32 và 64 cũng thế. Việc gọi dll trong thư mục hệ thống hay thư mục ngoài của dll không khác nhau gì cả.
Mạnh mới thử chép vào System khai báo như sau chạy rất tốt

Mã:
const
  NomDLL = 'FormInDLL.dll'; // Khai báo Load DLL trong Folder System Windows
procedure ShowForm stdcall; external NomDLL;
Gọi hàm thì nó đơn giản hơn
Mã:
LibHandle := LoadLibrary(NomDLL);
...
LShowForm := GetProcAddress(LibHandle, 'ShowForm');

Tại làm biếng muốn cho vào cùng Folder để test code các kiểu xem sao đó mà
Vì code viết thêm bớt liên tục ko lẻ cứ tí một lại copy vào Folder System thấy cũng bất tiện
Bài đã được tự động gộp:

Cái này win 7 em không thấy bị chỉ bị win 10. Em không biết bị gì nữa.

Em còn đang dính cái lỗi 217 build dll mà chưa mò ra nè
Cứ vài phút cái giao diên Delphi nó cứ nháy nháy mấy phát liên tục thấy khó chịu quá .... ai biết chỉ dùm Mạnh cách tắt nó
 
Upvote 0
Mạnh mới thử chép vào System khai báo như sau chạy rất tốt

Mã:
const
  NomDLL = 'FormInDLL.dll'; // Khai báo Load DLL trong Folder System Windows
procedure ShowForm stdcall; external NomDLL;
Gọi hàm thì nó đơn giản hơn
Mã:
LibHandle := LoadLibrary(NomDLL);
...
LShowForm := GetProcAddress(LibHandle, 'ShowForm');

Tại làm biếng muốn cho vào cùng Folder để test code các kiểu xem sao đó mà
Vì code viết thêm bớt liên tục ko lẻ cứ tí một lại copy vào Folder System thấy cũng bất tiện
Bài đã được tự động gộp:


Cứ vài phút cái giao diên Delphi nó cứ nháy nháy mấy phát liên tục thấy khó chịu quá .... ai biết chỉ dùm Mạnh cách tắt nó

Nó báo lỗi ở dòng nào? Khi chạy thì biến LibHandle có giá trị <>0 hay là 0 ?
Khi lỗi thì có thông báo thế nào?
 
Upvote 0
Nó báo lỗi ở dòng nào? Khi chạy thì biến LibHandle có giá trị <>0 hay là 0 ?
Khi lỗi thì có thông báo thế nào?
Nếu khai báo vậy thì chạy tốt không có lỗi còn LibHandle có giá trị <>0 hay là 0 cái này mạnh biết

mấy bài trước đang hỏi @thuyyeu99 là cho hai cái DLL vào cùng folder xong load nó mà lấy path từ a.dll + B.dll xong load nó mà báo lỗi không được ... có mô tả mấy bài trên

VD: 2 DLL trong cùng Folder khai báo như sau nó báo lỗi
Mã:
PathDLL := (gsAppPath + 'FormInDLL.dll');
ShowMessage(PathDLL);
Lỗi dòng sau khi Build
LibHandle := LoadLibrary(PathDLL);
 
Lần chỉnh sửa cuối:
Upvote 0
Lang thang lọ mọ đọc tài liệu cái này móc cái kia ... thấy Bill nói về Array API ... lưu vào đây cho ai iu thì đọc ... sau này quên vào đây coi lại
 
Upvote 0
Rảnh đang tìm vọc cái này mà thấy ít tài liệu quá
Mã:
procedure TMyAddin.OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray);
var FApp:ExcelApplication;
CTP:TCustomTaskPane;
begin
...
  CTP:=TCustomTaskPane.Create(Self);
//?
  CTP.Visible:=True;
end;
Mã:
Quản lý để làm điều đó bản thân mình. Đối với bất cứ ai có cùng một vấn đề, đăng giải pháp tại đây

Tạo bổ trợ
Thêm biểu mẫu ActiveX vào dự án bổ trợ
Thêm mã dưới đây vào tập tin addin .pas
procedure TmyAddin.CTPFactoryAvailable(const CTPFactoryInst: ICTPFactory); safecall;
Var
    CTP: _CustomTaskPane;
//  NP: TActiveXformClass;
begin  
    CTP:= CTPFactoryInst.CreateCTP('<replace with add-in name>.<replace with activeXform name>', 'pane caption', EmptyParam);
//  NP := TNavigationPane(ctp.ContentControl);
    CTP.Visible := true;
end;
Thấy trên VB có code mẫu mà Excel VBA chưa thấy ai làm nhỉ
 
Lần chỉnh sửa cuối:
Upvote 0
Trong Office2010.pas có TCustomTaskPane ... vậy là nó loanh quanh đâu đó vấn đề khởi tạo khai báo và sử dụng thôi ... mò mò ===\. -0-0-0-
Mã:
procedure TCustomTaskPane.InitServerData;
const
  CServerData: TServerData = (
    ClassID:   '{C5771BE5-A188-466B-AB31-00A6A32B1B1C}';
    IntfIID:   '{000C033B-0000-0000-C000-000000000046}';
    EventIID:  '{000C033C-0000-0000-C000-000000000046}';
    LicenseKey: nil;
    Version: 500);
begin
  ServerData := @CServerData;
end;

procedure TCustomTaskPane.Connect;
var
  punk: IUnknown;
begin
  if FIntf = nil then
  begin
    punk := GetServer;
    ConnectEvents(punk);
    Fintf:= punk as _CustomTaskPane;
  end;
end;

procedure TCustomTaskPane.ConnectTo(svrIntf: _CustomTaskPane);
begin
  Disconnect;
  FIntf := svrIntf;
  ConnectEvents(FIntf);
end;

procedure TCustomTaskPane.DisConnect;
begin
  if Fintf <> nil then
  begin
    DisconnectEvents(FIntf);
    FIntf := nil;
  end;
end;

function TCustomTaskPane.GetDefaultInterface: _CustomTaskPane;
begin
  if FIntf = nil then
    Connect;
  Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call "Connect" or "ConnectTo" before this operation');
  Result := FIntf;
end;

constructor TCustomTaskPane.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

destructor TCustomTaskPane.Destroy;
begin
  inherited Destroy;
end;

procedure TCustomTaskPane.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin
  case DispID of
    -1: Exit;  // DISPID_UNKNOWN
    1: if Assigned(FOnVisibleStateChange) then
         FOnVisibleStateChange(Self, IUnknown(TVarData(Params[0]).VPointer) as _CustomTaskPane {const _CustomTaskPane});
    2: if Assigned(FOnDockPositionStateChange) then
         FOnDockPositionStateChange(Self, IUnknown(TVarData(Params[0]).VPointer) as _CustomTaskPane {const _CustomTaskPane});
  end; {case DispID}
end;

function TCustomTaskPane.Get_Title: WideString;
begin
  Result := DefaultInterface.Title;
end;

function TCustomTaskPane.Get_Application: IDispatch;
begin
  Result := DefaultInterface.Application;
end;

function TCustomTaskPane.Get_Window: IDispatch;
begin
  Result := DefaultInterface.Window;
end;

function TCustomTaskPane.Get_Visible: WordBool;
begin
  Result := DefaultInterface.Visible;
end;

procedure TCustomTaskPane.Set_Visible(prop: WordBool);
begin
  DefaultInterface.Visible := prop;
end;

function TCustomTaskPane.Get_ContentControl: IDispatch;
begin
  Result := DefaultInterface.ContentControl;
end;

function TCustomTaskPane.Get_Height: SYSINT;
begin
  Result := DefaultInterface.Height;
end;

procedure TCustomTaskPane.Set_Height(prop: SYSINT);
begin
  DefaultInterface.Height := prop;
end;

function TCustomTaskPane.Get_Width: SYSINT;
begin
  Result := DefaultInterface.Width;
end;

procedure TCustomTaskPane.Set_Width(prop: SYSINT);
begin
  DefaultInterface.Width := prop;
end;

function TCustomTaskPane.Get_DockPosition: MsoCTPDockPosition;
begin
  Result := DefaultInterface.DockPosition;
end;

procedure TCustomTaskPane.Set_DockPosition(prop: MsoCTPDockPosition);
begin
  DefaultInterface.DockPosition := prop;
end;

function TCustomTaskPane.Get_DockPositionRestrict: MsoCTPDockPositionRestrict;
begin
  Result := DefaultInterface.DockPositionRestrict;
end;

procedure TCustomTaskPane.Set_DockPositionRestrict(prop: MsoCTPDockPositionRestrict);
begin
  DefaultInterface.DockPositionRestrict := prop;
end;

procedure TCustomTaskPane.Delete;
begin
  DefaultInterface.Delete;
end;

procedure Register;
begin
  RegisterComponents(dtlServerPage, [TCustomXMLSchemaCollection, TCustomXMLPart, TCustomXMLParts, TCustomTaskPane]);
end;
 

File đính kèm

  • Office2010.rar
    76.5 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
Mạnh loay hay làm theo hướng dẫn của bài này cả tuần nay mà không xong ... vậy úp bài + Code mẫu của bài đó nhờ các Bạn chỉ dùm
( Thực ra link đã úp từ mấy bài trước )

Mình tải code đó về đã build trên Delphi7 & Delphi 10.2.3 và đã Reg Run As hết mà sao nó không có sử dụng được hàm sau trong COM Add-Ins
Mã:
Function TDelphiAddin.SimpleAdd (X, Y: Double): Double;
begin
  result: = X + Y;
end;

ý mình muốn hỏi là phải chỉnh sửa lại toàn bộ mã nguồn đó sao cho sử dụng được hàm SimpleAdd ở trên Cells khi Gõ A1 = SimpleAdd (B1,B2) Enter là nó trả về kết quả của Hàm

Mạnh mò các kiểu cả tuần nay ko ra ... rất mong sự trợ giúp của các Bạn
Cảm ơn rất nhiều
 

File đính kèm

  • AutomationAddInSample.zip
    160.9 KB · Đọc: 11
Upvote 0
Web KT
Back
Top Bottom