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:
Mới coi Trên Delphi 7 cũng ko có luôn nhé ... chắc nhớ lộn tên file rồi
 
Upvote 0
Upvote 0

File đính kèm

  • TDUMP.rar
    143 KB · Đọc: 4
Upvote 0
Cảm ơn các bạn, xong rồi. Bị AV bắt lầm khi build realease mode, phải build debug mode nó mới bỏ qua
 
Upvote 0
Cái khúc chữ cái t của Mạnh đó ko thấy ... tại sao ta ??!!
Capture.JPG
 
Upvote 0
Không biết nữa Win em 32. chắc cái T của anh no bi lỗi gì dồi @!>><
 
Upvote 0
Không biết nữa Win em 32. chắc cái T của anh no bi lỗi gì dồi @!>><
Úp cho Mạnh cái File đó về mở coi cái xem sao ... TCA chắc đang hack code Delphi đó
Mã:
Rất cám ơn người tạo ra dự án ban đầu:
 http://tds2pdb.sourceforge.net/

Tôi chỉ nhận xét một số mã, vì vậy nó cố gắng tiếp tục
cũng tạo các tệp .pdb cho các tệp thực thi Delphi.
(dự án ban đầu chỉ hỗ trợ C ++ Builder)

Các bước sử dụng với Delphi (32 và 64 bit!):
- Biên dịch dự án của bạn với "TD32" (D7?) Hoặc với "Thông tin gỡ lỗi" (Trình biên dịch -> Tùy chọn liên kết, D2010, XE2)
- Tách thông tin TD32 thành tệp .tds riêng biệt với:
  tdstrp32.exe -s <yourproject.exe>
  Lưu ý: không sử dụng khóa -s với exe 64 bit -> nó sẽ làm hỏng exe của bạn! (.tds là OK)
- Chuyển đổi tệp .tds thành tệp .pdb với: 
  tds2pdb.exe <yourproject.tds>
- Chạy chương trình của bạn
- Đính kèm trình gỡ lỗi hoặc trình quản lý tác vụ và viết đường dẫn đến tệp .pdb:
  - WinDbg.exe (Công cụ gỡ lỗi của Microsoft cho Windows, x86 cho 32 bit, x64 cho 64 bit)
    - Tệp -> Đường dẫn tệp biểu tượng
  - Khám phá
    - Tùy chọn -> Cấu hình biểu tượng
  - Hacker
    - Hacker -> Tùy chọn -> Biểu tượng
- Xem ngăn xếp của chuỗi của bạn -> bạn sẽ thấy tên "lớp" và hàm của bạn ngay bây giờ!
 
Upvote 0
Mạnh đã viết được Add-ins trên Delphi *.XLL chạy rất tốt ........... Trân trọng thông báo với cả nhà vậy @!>><_+)(9
Ai thích nghiên cứu vào link bài #869 nghiên cứu kỹ nhiều bài trong đó là viết ok ....
Nó quá đơn giản luôn .... trong đó nó chỉ cà Viết Menu Ribbon đó he ....
Google như tàng kinh các vậy .... chia sẻ link đó ai có đam mê là viết quá ngon luôn ko Phải C/c++ Or DNA làm cái chi cho mệt
Chúc mừng bác Mạnh nhé!
Bác có thể chia sẻ cho anh em code một Add-ins mẫu để mọi người cùng tham khảo học hỏi được không?
Em cũng đang nghiên cứu mấy link bác dẫn ở bài #869 nhưng chưa nắm bắt được hết vấn đề vì trình độ có hạn.
Bài đã được tự động gộp:

Mạnh coi cái Video bài 1 link sau thấy cũng mê lắm .... :p

Mấy ngày nay khi nào rảnh Mạnh tìm tài liệu hay code mẫu trên Delphi cũng bắt trước làm theo 1 cái mà thấy quá khó luôn

Tìm trên Google thì thấy người ta toàn viết C/c++ Or DNA ... vvv còn tài liệu hay code mẫu trên Delphi rất ít
Hàm Mẫu
Mã:
function SampleFunc(x: LPXLOPER): LPXLOPER; stdcall;
type
  tmulti = array[0..0] of XLOPER;
  pmulti = ^tmulti;
var
  oper: XLOPER;
  i, j: Integer;
  lsum: Double;
  lchar, lbool, lerr, lempty: Integer;
begin
  Msg:='Blub';
  case (x.xltype and $0FFF) of
    xltypeNum     : Msg:= 'number';
    xltypeStr     : Msg:= 'string';
    xltypeBool    : Msg:= 'bool';
    xltypeErr     : Msg:= 'error';
    xltypeMissing : Msg:= 'nothing';
    xltypeNil     : Msg:= 'empty cell';
    xltypeMulti   : begin
      with x.val.xarray do begin
        lsum:=0;
        lchar:= 0;
        lbool:=0;
        lerr:=0;
        lempty:=0;
        for i:=0 to rows - 1 do begin
          for j:=0 to columns - 1 do begin
            oper:= pmulti(lparray)[i * columns + j];
            case (oper.xltype and $0FFF) of
              xltypeNum : lsum:= lsum + oper.val.num;
              xltypeStr : lchar:= lchar +
                Length(PShortString(oper.val.str)^);
              xltypeBool: inc(lbool);
              xltypeErr : inc(lerr);
              xltypeNil : inc(lempty);
            end;
          end;
        end;
        Msg:= 'range ' +
              IntToStr(rows)    + 'rows ' +
              IntToStr(columns) + 'cols ' +
              '; sum: '    + FloatToStr(lsum) +
              '; chars: '  + IntToStr(lchar) +
              '; bools: '  + IntToStr(lbool) +
              '; errors: ' + IntToStr(lerr) +
              '; empty: '  + IntToStr(lempty);
      end;
    end;
  end;
  if (x.xltype and xlbitXLFree) = xlbitXLFree then begin
    Msg:= Msg + ' XLFree';
    Excel4e(xlFree, nil, 1, [x]);
  end;
  res.xltype:= xltypeStr;
  res.val.str:= @Msg;
  result:=@res;
end;
XLLs – Add a Menu
Mã:
const
  CmdP : String[20] = 'MenuCommand';
  CmdT : String[20] = 'J';
  CmdF : String[20] = 'SampleCommand';

function xlAutoOpen: integer; stdcall;
begin
  {...}
    // register menu command
    Arg2.val.str:= @CmdP;
    Arg3.val.str:= @CmdT;         // always "J"
    Arg4.val.str:= @CmdF;
    Arg5.xltype:= xltypeMissing; // not required for commands
    Arg6.xltype:= xltypeInt;
    Arg6.val.w:= 2;              // 2 = command
    Excel4e(xlfRegister, nil, 6, // registers the command
      [@Arg1, @Arg2, @Arg3, @Arg4, @Arg5, @Arg6]);
  {...}
end;
mà thấy họ hướng dẫn kiểu nữa vời vậy coi tới lui vẫn tịt toàn tập luôn ...
vậy Mạnh muốn hỏi bạn nào biết chỉ dùm mạnh chỉ cơ bản như sau:

1/ khai báo trong Delphi làm sao khi mình Build *.XLL xong thì check trên Excel nó load vào luôn và ngược lại khi Uncheck nó
2/ Viết 1 cái hàm đơn giản như GetSum() trong *.XLL khi load trên Excel Gõ =Getsum() là nó chạy ok

Với mong muốn rất cơ bản và đơn giản vậy ai biết chỉ dùm ( nếu có code mẫu trên Delphi càng tốt hay tài liệu chỉ dùm )
Xin cảm ơn
Bác Mạnh ơi, em đang nghiên cứu link anh đưa nhưng cái Unit dXLCall em copy code về chạy thử thì thấy báo lỗi, còn download file mẫu của tác giả về thì không có file dXLCall.pas nên chưa học hỏi gì được. Bác Mạnh hiểu biết nhiều chỉ giúp em với.
Em tìm được một bài của bác Tuân viết cách đây đã hơn chục năm rồi nhưng đọc qua cũng chỉ hiểu sơ sơ thôi chứ chưa nắm bắt rõ, mong mọi người chỉ giáo thêm.
 
Lần chỉnh sửa cuối:
Upvote 0
Chúc mừng bác Mạnh nhé!
Bác có thể chia sẻ cho anh em code một Add-ins mẫu để mọi người cùng tham khảo học hỏi được không?
Em cũng đang nghiên cứu mấy link bác dẫn ở bài #869 nhưng chưa nắm bắt được hết vấn đề vì trình độ có hạn.
Bài đã được tự động gộp:


Bác Mạnh ơi, em đang nghiên cứu link anh đưa nhưng cái Unit dXLCall em copy code về chạy thử thì thấy báo lỗi, còn download file mẫu của tác giả về thì không có file dXLCall.pas nên chưa học hỏi gì được. Bác Mạnh hiểu biết nhiều chỉ giúp em với.
Em tìm được một bài của bác Tuân viết cách đây đã hơn chục năm rồi nhưng đọc qua cũng chỉ hiểu sơ sơ thôi chứ chưa nắm bắt rõ, mong mọi người chỉ giáo thêm.
Cái XLL đó nên hỏi @Nguyễn Duy Tuân là có giải pháp tuyệt vời cho bạn.... vì mạnh mò nát google mà ko có tài liệu ( nếu có toàn c/c++ ... delphi cho Excel quá ít )
trình của Mạnh thuộc hạng ruồi nên tạm gác XLL lại rồi.... sau này nếu khá xem tình hình sao ... lại khai quật lại nó :p ;)
 
Lần chỉnh sửa cuối:
Upvote 0
đây là code c/c++ mạnh tìm thấy trên mạng .... còn ai viết hay úp nó mạnh Tịt :p;)
May ra có Bạn nào biết code C/c++ chuyển dùm nó qua Delphi thì tốt ... lại mò học tiếp
Mã:
/*
**  Microsoft Excel Developer's Toolkit
**  Version 15.0
**
**  File:           INCLUDE\XLCALL.H
**  Description:    Header file for for Excel callbacks
**  Platform:       Microsoft Windows
**
**  DEPENDENCY:
**  Include <windows.h> before you include this.
**
**  This file defines the constants and
**  data types which are used in the
**  Microsoft Excel C API.
**
*/

#pragma once

/*
** XL 12 Basic Datatypes
**/

typedef INT32 BOOL;            /* Boolean */
typedef WCHAR XCHAR;            /* Wide Character */
typedef INT32 RW;            /* XL 12 Row */
typedef INT32 COL;                   /* XL 12 Column */
typedef DWORD_PTR IDSHEET;        /* XL12 Sheet ID */

/*
** XLREF structure
**
** Describes a single rectangular reference.
*/

typedef struct xlref
{
    WORD rwFirst;
    WORD rwLast;
    BYTE colFirst;
    BYTE colLast;
} XLREF, *LPXLREF;


/*
** XLMREF structure
**
** Describes multiple rectangular references.
** This is a variable size structure, default
** size is 1 reference.
*/

typedef struct xlmref
{
    WORD count;
    XLREF reftbl[1];                    /* actually reftbl[count] */
} XLMREF, *LPXLMREF;


/*
** XLREF12 structure
**
** Describes a single XL 12 rectangular reference.
*/

typedef struct xlref12
{
    RW rwFirst;
    RW rwLast;
    COL colFirst;
    COL colLast;
} XLREF12, *LPXLREF12;


/*
** XLMREF12 structure
**
** Describes multiple rectangular XL 12 references.
** This is a variable size structure, default
** size is 1 reference.
*/

typedef struct xlmref12
{
    WORD count;
    XLREF12 reftbl[1];                    /* actually reftbl[count] */
} XLMREF12, *LPXLMREF12;


/*
** FP structure
**
** Describes FP structure.
*/

typedef struct _FP
{
    unsigned short int rows;
    unsigned short int columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP;

/*
** FP12 structure
**
** Describes FP structure capable of handling the big grid.
*/

typedef struct _FP12
{
    INT32 rows;
    INT32 columns;
    double array[1];        /* Actually, array[rows][columns] */
} FP12;


/*
** XLOPER structure
**
** Excel's fundamental data type: can hold data
** of any type. Use "R" as the argument type in the
** REGISTER function.
**/

typedef struct xloper
{
    union
    {
        double num;                    /* xltypeNum */
        LPSTR str;                    /* xltypeStr */
#ifdef __cplusplus
        WORD xbool;                    /* xltypeBool */
#else   
        WORD bool;                    /* xltypeBool */
#endif   
        WORD err;                    /* xltypeErr */
        short int w;                    /* xltypeInt */
        struct
        {
            WORD count;                /* always = 1 */
            XLREF ref;
        } sref;                        /* xltypeSRef */
        struct
        {
            XLMREF *lpmref;
            IDSHEET idSheet;
        } mref;                        /* xltypeRef */
        struct
        {
            struct xloper *lparray;
            WORD rows;
            WORD columns;
        } array;                    /* xltypeMulti */
        struct
        {
            union
            {
                short int level;        /* xlflowRestart */
                short int tbctrl;        /* xlflowPause */
                IDSHEET idSheet;        /* xlflowGoto */
            } valflow;
            WORD rw;                /* xlflowGoto */
            BYTE col;                /* xlflowGoto */
            BYTE xlflow;
        } flow;                        /* xltypeFlow */
        struct
        {
            union
            {
                BYTE *lpbData;            /* data passed to XL */
                HANDLE hdata;            /* data returned from XL */
            } h;
            long cbData;
        } bigdata;                    /* xltypeBigData */
    } val;
    WORD xltype;
} XLOPER, *LPXLOPER;

/*
** XLOPER12 structure
**
** Excel 12's fundamental data type: can hold data
** of any type. Use "U" as the argument type in the
** REGISTER function.
**/

typedef struct xloper12
{
    union
    {
        double num;                           /* xltypeNum */
        XCHAR *str;                           /* xltypeStr */
        BOOL xbool;                           /* xltypeBool */
        int err;                           /* xltypeErr */
        int w;
        struct
        {
            WORD count;                       /* always = 1 */
            XLREF12 ref;
        } sref;                        /* xltypeSRef */
        struct
        {
            XLMREF12 *lpmref;
            IDSHEET idSheet;
        } mref;                        /* xltypeRef */
        struct
        {
            struct xloper12 *lparray;
            RW rows;
            COL columns;
        } array;                    /* xltypeMulti */
        struct
        {
            union
            {
                int level;            /* xlflowRestart */
                int tbctrl;            /* xlflowPause */
                IDSHEET idSheet;        /* xlflowGoto */
            } valflow;
            RW rw;                           /* xlflowGoto */
            COL col;                       /* xlflowGoto */
            BYTE xlflow;
        } flow;                        /* xltypeFlow */
        struct
        {
            union
            {
                BYTE *lpbData;            /* data passed to XL */
                HANDLE hdata;            /* data returned from XL */
            } h;
            long cbData;
        } bigdata;                    /* xltypeBigData */
    } val;
    DWORD xltype;
} XLOPER12, *LPXLOPER12;

/*
** XLOPER and XLOPER12 data types
**
** Used for xltype field of XLOPER and XLOPER12 structures
*/

#define xltypeNum        0x0001
#define xltypeStr        0x0002
#define xltypeBool       0x0004
#define xltypeRef        0x0008
#define xltypeErr        0x0010
#define xltypeFlow       0x0020
#define xltypeMulti      0x0040
#define xltypeMissing    0x0080
#define xltypeNil        0x0100
#define xltypeSRef       0x0400
#define xltypeInt        0x0800

#define xlbitXLFree      0x1000
#define xlbitDLLFree     0x4000

#define xltypeBigData    (xltypeStr | xltypeInt)


/*
** Error codes
**
** Used for val.err field of XLOPER and XLOPER12 structures
** when constructing error XLOPERs and XLOPER12s
*/

#define xlerrNull    0
#define xlerrDiv0    7
#define xlerrValue   15
#define xlerrRef     23
#define xlerrName    29
#define xlerrNum     36
#define xlerrNA      42
#define xlerrGettingData 43


/*
** Flow data types
**
** Used for val.flow.xlflow field of XLOPER and XLOPER12 structures
** when constructing flow-control XLOPERs and XLOPER12s
**/

#define xlflowHalt       1
#define xlflowGoto       2
#define xlflowRestart    8
#define xlflowPause      16
#define xlflowResume     64


/*
** Return codes
**
** These values can be returned from Excel4(), Excel4v(), Excel12() or Excel12v().
*/

#define xlretSuccess        0    /* success */
#define xlretAbort          1    /* macro halted */
#define xlretInvXlfn        2    /* invalid function number */
#define xlretInvCount       4    /* invalid number of arguments */
#define xlretInvXloper      8    /* invalid OPER structure */ 
#define xlretStackOvfl      16   /* stack overflow */ 
#define xlretFailed         32   /* command failed */ 
#define xlretUncalced       64   /* uncalced cell */
#define xlretNotThreadSafe  128  /* not allowed during multi-threaded calc */
#define xlretInvAsynchronousContext  256  /* invalid asynchronous function handle */
#define xlretNotClusterSafe  512  /* not supported on cluster */


/*
** XLL events
**
** Passed in to an xlEventRegister call to register a corresponding event.
*/

#define xleventCalculationEnded      1    /* Fires at the end of calculation */
#define xleventCalculationCanceled   2    /* Fires when calculation is interrupted */


/*
** Function prototypes
*/

#ifdef __cplusplus
extern "C" {
#endif

int _cdecl Excel4(int xlfn, LPXLOPER operRes, int count,... );
/* followed by count LPXLOPERs */

int pascal Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER opers[]);

int _cdecl Excel12(int xlfn, LPXLOPER12 operRes, int count,... );
/* followed by count LPXLOPER12s */
int pascal Excel12v(int xlfn, LPXLOPER12 operRes, int count, LPXLOPER12 opers[]);

#ifdef __cplusplus
}
#endif
 
Upvote 0
Upvote 0
Các bạn nếu muốn tự tay viết code 100% để lập trình XLL thì bắt bắt đàu từ tài liệu gốc viết bằng C/C++ của Microsoft. Đây là bộ SDK mới nhất của họ. Đưa về Delphi phải khá thông thạo cả hai ngôn ngữ C + Delphi để chuyển hóa về Delphi.
Theo ý kiến cá nhân của em thì XLL không dành cho người dùng phổ thông, nó dành cho những người chuyên về IT hay nhà phát triển phần mềm gì đó. Có một khoảng cách rất lớn về làm chủ VBA Excel và XLL. Nó đòi hỏi hiểu biết sâu về hệ thống và cả kinh nghiệm lập trình nữa. Với riêng em thì để viết được một Adins XLL ra trò còn phải cố gắng tích lũy nhiều kiến thức và trải nghiệm thực tế nữa. Và chắc chắn rằng nó sẽ tốn không ít thời gian đâu. Chúc mọi người có nhiều niềm vui với XLL của riêng mình.
 
Upvote 0
Theo ý kiến cá nhân của em thì XLL không dành cho người dùng phổ thông, nó dành cho những người chuyên về IT hay nhà phát triển phần mềm gì đó. Có một khoảng cách rất lớn về làm chủ VBA Excel và XLL. Nó đòi hỏi hiểu biết sâu về hệ thống và cả kinh nghiệm lập trình nữa. Với riêng em thì để viết được một Adins XLL ra trò còn phải cố gắng tích lũy nhiều kiến thức và trải nghiệm thực tế nữa. Và chắc chắn rằng nó sẽ tốn không ít thời gian đâu. Chúc mọi người có nhiều niềm vui với XLL của riêng mình.

Chính xác đó. Muốn tự tay viết 100% XLL thì phải "thâm niên công tác" và đúc kết nhiều kinh nghiệm tốt lập trình API. Nên những người khác muốn không mất nhiều thời gian để tự tay làm từ A-Z thì cần dùng thư viện lập trình từ người khác sẽ có sản phẩm nhanh gọn. Vì thế mới có nhóm người chuyên viết thư viện cho người khác thừa kế để viết ứng dụng để viết lớp ứng dụng khác,. Excel, VBA cũng coi là một framework về bảng tính, chúng ta coi là nền tảng ứng dụng các object/class như RANGE, WORKSHEET,... lập trình trên nó thôi chứ hiếm có người đi tự viết cái RANGE hoặc không thể làm tốt hơn MS. nữa đâu :). App GRAP viết phần mềm cũng dựa trên nền tảng Google Map để tạo ra app riêng. Vì thế trong lập trình ứng dụng không phải cái gì cũng tự viết hết mà quan trọng biết hướng giải quyết để tìm công nghệ nền phụ trợ đắc lực. Còn việc học tự mỗi người sẽ tự tìm hiểu lâu dài nếu có đam mêm hoặc mục tiêu cụ thể.
 
Upvote 0
Theo ý kiến cá nhân của em thì XLL không dành cho người dùng phổ thông, nó dành cho những người chuyên về IT hay nhà phát triển phần mềm gì đó. Có một khoảng cách rất lớn về làm chủ VBA Excel và XLL. Nó đòi hỏi hiểu biết sâu về hệ thống và cả kinh nghiệm lập trình nữa. Với riêng em thì để viết được một Adins XLL ra trò còn phải cố gắng tích lũy nhiều kiến thức và trải nghiệm thực tế nữa. Và chắc chắn rằng nó sẽ tốn không ít thời gian đâu. Chúc mọi người có nhiều niềm vui với XLL của riêng mình.
Mạnh hỏi thật nhé bạn là đọc thật kỹ hết link mình úp ở bài 869 chưa đó ???!!!

1/ Trong link trên có Code tạo XLL và COM Menu trên Delphi
2/ Code mẫu chi tiết cũng trang đó

3/ Code Mẫu tạo COM .. Menu trên Delphi ... cách xài coi lại các bài link sau

Bạn đừng có nản như vậy cố gắng lên thử copy code đó làm sao cho nó chạy ok cái đã xong tính tiếp
Mình rất mong có nhiều bạn Học sẻ có nhiều tương tác hay về Delphi cho Excel ... và Google sẻ cho bạn nhiều thông tin nhất

@giaiphap rảnh tải code về coi sao ta nghiên cứu viết Add-ins hay đó ... khó khăn tới đâu ta tìm cách xử tới đó he
 
Upvote 0
Mạnh hỏi thật nhé bạn là đọc thật kỹ hết link mình úp ở bài 869 chưa đó ???!!!

1/ Trong link trên có Code tạo XLL và COM Menu trên Delphi
2/ Code mẫu chi tiết cũng trang đó

3/ Code Mẫu tạo COM .. Menu trên Delphi ... cách xài coi lại các bài link sau

Bạn đừng có nản như vậy cố gắng lên thử copy code đó làm sao cho nó chạy ok cái đã xong tính tiếp
Mình rất mong có nhiều bạn Học sẻ có nhiều tương tác hay về Delphi cho Excel ... và Google sẻ cho bạn nhiều thông tin nhất

@giaiphap rảnh tải code về coi sao ta nghiên cứu viết Add-ins hay đó ... khó khăn tới đâu ta tìm cách xử tới đó he
Cảm ơn bác Mạnh đã động viên em. Có điều em không có nhiều thời gian nên chỉ tranh thủ học hỏi thêm thôi chứ không đủ thời gian để đào sâu nghiên cứu cộng thêm trình độ có hạn nên thấy Add-in xll thật sự khó nhằn. Em đã đọc link bác Mạnh chỉ và có tải file mẫu về chạy thử nhưng em đang mắc ở cái file dXCall.dcu, không biết code ở trong đó như thế nào nhưng hình như nó chưa cho mình viết font chữ unicode, hay em do cách chỉnh sửa code trên file xll không đúng.
 
Upvote 0
cái dXCall.dcu Delphi đã mã hóa nó rồi thay vì họ cho bạn File dXCall.pas thì có code mà chỉnh sửa thì họ lại cho File dXCall.dcu sau khi Đã build nó xong lấy File đó cho bạn thì bạn chỉ biết xài nó theo Version của Delphi mà thôi

VD: như @Nguyễn Duy Tuân có cho bạn thì cho File *.pas ấy thì còn có code mà sửa còn cho File *.dcu thì cũng chỉ có mà xài vậy (cá nhân Mạnh thấy đó là cái hay của Dephi đó ) Còn giải mã file *.dcu của Dephi thử liên hệ @ThangCuAnh xem tình hình sao may ra có của rộng đấy he ;)
 
Upvote 0
Web KT
Back
Top Bottom