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

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,235
Được thích
9,746
Điểm
860
Nơi ở
Hà Nội
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 ;)
Thôi thì người ta cho dcu cũng tốt rồi. Mình build ra dll/xll vẫn là của mình mà.
 

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Thôi thì người ta cho dcu cũng tốt rồi. Mình build ra dll/xll vẫn là của mình mà.
Delphi nó sáng tạo ra cái dcu hay thật ... Share cho ai đó xài, sử dụng và định đoạt nó ok ... còn chỉnh sửa nó hay coi code thì thua :p
vậy trong 1 Cty làm 1 cái DLL/XLL thật bự có rất nhiều Unit thì họ chỉ cần gửi cái file dcu là ok còn code hãy chờ đấy (Vụ này thangcuanh may có cửa rộng ) và đó cũng là cách bảo toàn code của ai đó trong 1 dự án code đại tập thể ( quá hay )
Bài đã được tự động gộp:

mà hình như @Hieu011 chưa hiểu file *.dcu thì phải và chưa biết sử dụng nó sao
1/ File *.dcu là file sau khi Delphi nó build file *.pas xong tạo ra file *.dcu trong cùng Folder với file DLL/XLL
2/ Sử dung file *.dcu như File *.pass
3/ Khác nhau là File *.pas coi code chỉnh sửa các kiểu nếu bạn có khả năng .... Còn File *.dcu thì ngược lại đã mã hóa chỉ biết Uses nó mà xài (nếu có khả năng hãy thử giải mã nó xem sao)
 
Lần chỉnh sửa cuối:

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,312
Được thích
543
Điểm
860
Vậy thì lấy để làm gì. Có làm được gì đâu hihi, bởi vậy em chẳng lệ thuộc vào ai hihihihi. Tự mình làm tốt xấu gì cũng của mình hihihi
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,235
Được thích
9,746
Điểm
860
Nơi ở
Hà Nội
Vậy thì lấy để làm gì. Có làm được gì đâu hihi, bởi vậy em chẳng lệ thuộc vào ai hihihihi. Tự mình làm tốt xấu gì cũng của mình hihihi

!
Mình không thể kế thừa hết tinh hoa nhân loại. Có thể tự chinh phục thì từng bước theo năm tháng.
Cũng chỉ vì hành lang pháp lý chứ như nước nào đó thì Việt Nam cũng đầy cái để nước ngoài cùng học tập đấy
 

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Suy cho cùng mọi cái cũng xài ké cái API của Bill cả có ai viết XLL mà tách khỏi API của Bill mô ;):p;)
 

Hieu011

Thành viên mới
Tham gia ngày
12 Tháng chín 2015
Bài viết
13
Được thích
6
Điểm
165
Tuổi
21
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 ;)
Bác Mạnh nói chuẩn rồi có điều là em đang làm cái việc của bác Tuân cách đây hơn chục năm là chuyển đổi cái XLCALL về Delphi, tất nhiên là có sự hỗ trợ của một bạn là dân IT. Còn việc dịch mã file dXLCcall.dcu em chưa bao giờ nghĩ tới.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,859
Được thích
4,224
Điểm
560
em đang làm cái việc của bác Tuân cách đây hơn chục năm là chuyển đổi cái XLCALL về Delphi, tất nhiên là có sự hỗ trợ của một bạn là dân IT.
Thì bạn vào nơi mà Tuân từng hỏi. Biết đâu những người ngày đó giúp Tuân vẫn còn ở đó.
 

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Bác Mạnh nói chuẩn rồi có điều là em đang làm cái việc của bác Tuân cách đây hơn chục năm là chuyển đổi cái XLCALL về Delphi, tất nhiên là có sự hỗ trợ của một bạn là dân IT. Còn việc dịch mã file dXLCcall.dcu em chưa bao giờ nghĩ tới.
NẾU Mạnh biết viết cái dXLCcall.pas đó thì Mạnh cho bạn liền với vài lý do sau:

1/ nó theo cách hiểu đơn giản của mạnh là như cái tạo kết nối từ XLL qua Excel mà thôi .... tại vì code đó viết trên c/c++ nên rất ít người biết
mà những người biết 2 ngôn ngữ c/c++ và Delphi thì quá ít... nếu họ biết c/c++ thì họ viết luôn trên c/c++ cho khỏe chứ chuyển qua Delphi làm chi cho mất công ra

2/ Cái quan trọng nhất khi code XLL trên Delphi là bạn triển khai viết thêm code vào đó như thế nào .... thuật toán ra làm sao, ứng dụng chi tiết như thế nào vvv... cái đó mới làm nên đẳng cấp của người viết ra nó đúng ko !!!???

VD: như ADO mạnh chỉ cho bạn cách tạo kết nối lấy lên hay ghi xuống thì nó quá đơn giản phải ko và cái quan trọng nhất ở đây là gì ??!!! lấy lên tính toán +; - ; * ; / nói chung thuật toán xử lý nó mới là cái thật sự quan trọng đúng ko ?!

3/ nếu là mạnh thì sẻ cho Bạn vì mạnh sẻ là người đặt cái cục gạch đầu tiên trên GPE này trợ giúp các bạn học tập Delphi và viết XLL cho Excel và rồi khi phong trào phát triển tốt thì mạnh sẻ mở các lớp Delphi căn bản hay gì đó chẳng hạn vvv

Người ta sẻ biết rằng ông đó rất giỏi Delphi tại Việt nam và rất nhiệt tình nên mọi người nên cố giắng tham gia mà học sẻ rất tốt cho công việc của mình trong tương lai vvv ( đó là suy nghĩ thế chứ mạnh ko mưu cầu việc đó )

4/ Thực ra cách đây trên 1 tháng gì đó Mạnh có nhìn thấy cái code đó viết trên Delphi rồi nhưng lúc đó mạnh chưa hình dung nó là cái gì mà thấy quá dài dòng nên ko để ý tới .... sau khi có cái Video của tuân Viết XLL trên Delphi thì mạnh mới bất chợt nghĩ ra ... tìm mò lục lại bài đó thì link bài còn đó mà code ko còn ????!!!!

Code đó của người nước ngoài... Tay đó rất giỏi c/c++ và Delphi viết cho 1 người Việt Nam có hỏi code XLL trên c/c++ chuyển qua Delphi

rất tiếc khi nhận ra giá trị của nó thì ko còn nữa ???!!!!

5/ nếu bạn có nhờ ai đó chuyển từ c/c++ thì nên chuyển code mới nhất của Bill nha mình úp ở dưới

Cái Quan trong bậc nhất là Bạn viết thêm hàm gì vào trong đó ... Nó mới tạo nên sự khác biệt đẳng cấp vượt thời gian thế thôi ... còn lại nó cũng chỉ như cái tạo kết nối tới Excel mà thôi ... rất tiếc là khả năng mạnh ko có nên ko có gì cho Bạn cả ?!

Vui vẻ he ta từng ngày, từng ngày kiên trì mò tiếp
 

File đính kèm

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,235
Được thích
9,746
Điểm
860
Nơi ở
Hà Nội
Thì bạn vào nơi mà Tuân từng hỏi. Biết đâu những người ngày đó giúp Tuân vẫn còn ở đó.
Thời em làm XLL kiến thức về ngôn ngữ C chưa tốt nên khá chật vật khi đưa về Delphi. Nhưng cũng chỉ là các hàm đơn giản. Sau này nâng tầm ngôn ngữ và cày tài liệu gốc C của Microsoft mới tự xây dựng một nền tảng build XLL riêng cho cty em.

Để làm những món lập trình thư viện DLL/XLL các bạn cần vững ngôn ngữ Delphi. Đặc biệt khái niệm Pointer. Vì tài liệu gốc của MS là viết cho C, bây giờ họ chuyển nhiều sang C# nhưng cũng gần như giống nhau. Nếu các bạn muốn tự tay viết 100% thì cần học thêm về C (không cần phải thành thạo) để có thể hiểu bộ SDK của nhà sản xuất.
 
Lần chỉnh sửa cuối:

ThangCuAnh

Mới rờ Ét xeo
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
837
Được thích
667
Điểm
360
Nơi ở
Phờ lây cu
Bạn Tuân nên share file port .h đó qua .pas cho các bạn đi.
Mình nghỉ nó đơn giản mà, có gì phải dấu, làm của riêng đâu. Ai cũng port được cả.
Lần đầu tiên bạn Tuân hỏi, lâu lắm rồi, chắc gần chục năm, trên diễn đàn tin học.vn, mình với nick là TQN đã hướng dẫn bạn port, bạn chắc quên rồi, nhưng mình nhớ cái XLOPER đó mà.
Mình cũng port biết bao nhiêu SDK của OllyDbg, IDA, x64dbg, ImmDbg qua Delphi, share rộng rãi cho cộng đồng reversers, coders thế giới, có toan tính,đòi hỏi gì đâu....
 
Lần chỉnh sửa cuối:

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,235
Được thích
9,746
Điểm
860
Nơi ở
Hà Nội
Cách đây hơn 10 năm tôi có xem một ví dụ về tạo xll trên delphi của một anh Tây, nhưng nó hỗ trợ Delphi cũ và Excel cũ. Tôi biết trang này chính là code của anh tây đó và các bạn có thể tham khảo. Đây là những gì tôi biết trước đây từ người khác. Tôi tưởng bạn Mạnh hay ai đó dễ dàng tìm thấy trên Google rồi nền thôi. Nhưng tôi đoán các bạn cần code này.


Tôi không thích share những gì được người khác cho rằng nó rất đơn giản và nhiều người làm được hay tìm được vì thấy vai trò của mình không cần thiết nữa. Bản thân tôi tạo XLL là tự cày rất nhiều từ C, đọc nát tài liệu của Microsoft viết. Với tôi mọi thứ khi tự làm nó khó khăn lắm mà thấy các bạn đều nói dễ nên cũng khá tò mò...

Trên GPE này dần dần tôi chỉ như đi dạo, ngó nghiêng chứ không còn nhiều thời gian và hứng thú share hay khoe code như những năm trước đây. Và có thể ngày nào đó cũng không vào đây nữa.
 
Lần chỉnh sửa cuối:

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Bạn Tuân nên share file port .h đó qua .pas cho các bạn đi.
Mình nghỉ nó đơn giản mà, có gì phải dấu, làm của riêng đâu. Ai cũng port được cả.
Lần đầu tiên bạn Tuân hỏi, lâu lắm rồi, chắc gần chục năm, trên diễn đàn tin học.vn, mình với nick là TQN đã hướng dẫn bạn port, bạn chắc quên rồi, nhưng mình nhớ cái XLOPER đó mà.
Mình cũng port biết bao nhiêu SDK của OllyDbg, IDA, x64dbg, ImmDbg qua Delphi, share rộng rãi cho cộng đồng reversers, coders thế giới, có toan tính,đòi hỏi gì đâu....
like mỏi tay cho bài này ... lâu lâu sư phụ rảnh ghé GPE chỉ cho em út nó học một chút... đang vui vẻ vắng thấy buồn
tài liệu mới nhất của Bill sau khi Mạnh cài nó xong Copy ra

.... cái link bài của Trịnh công Kiên mạnh coi cả tháng nay rồi .... mà tại sao thấy rất nhiều trang đăng bài đó cuối cùng ai là tác giả bài đó ta
 

File đính kèm

Lần chỉnh sửa cuối:

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Rảnh vào GitHub coi thấy Delphi người ta Share code nhiều hơn các ngôn ngữ khác
nếu bạn nào yêu thích Delphi vào đó tạo một cái tài khoản xong tha hồ mà coi ... có cái chi mới nó báo qua mail cho he ...
lâu lâu thấy có cái rất hay
nnn.JPG
 

ThangCuAnh

Mới rờ Ét xeo
Tham gia ngày
1 Tháng mười hai 2017
Bài viết
837
Được thích
667
Điểm
360
Nơi ở
Phờ lây cu
Bạn nào lười hay không rành convert code C/C++ qua Pascal/Delphi thì tui tặng cho cái tool này để convert. Tool này tui dùng từ xưa giờ, thấy tốt nhất trong đống các tool h2pas, c2pas trên Internet hiện nay.
Tool gì thì tool, nó chỉ làm thay mình việc chân tay thôi, chứ việc chính như kiểm tra, format lại thì vẫn là con người làm.
Help, hdsd có đầy đủ, chịu khó đọc, mò mà dùng,đừng có hỏi linh tinh, vớ vẫn....
 

File đính kèm

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Cảm ơn Anh mới thử xong ... mai mốt rảnh em giáp vào Delphi chạy xem sao
Cơ bản vậy quá tốt rồi còn lại mò từng cái 1 vậy
Capture.JPG
 

File đính kèm

Lần chỉnh sửa cuối:

kieu manh

❆❆❆❆❆
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,677
Được thích
2,523
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Lang thang trên Google tìm tài liệu viết XLL trên Delphi mà quá hiếm luôn gần như ko có ( nếu có thì cũng quá ít )
Mới tìm thấy cấu trúc XLOPER trên Delphi của tây nó viết ... Úp cho các Bạn nào yêu thích có thể tham khảo thêm
Code két mang tính kế thừa ... cho đi để còn mãi ?!
Tây nó chỉ dẫn
Mã:
(*
   For reference...  Here are the microsoft C and my borland Pascal versions
of the Excel "xloper" structures.  Cảm ơn for the help!
Notes:  1) For each variant of the union in the C version of the xloper
type there is a single comment starting "xlType...", "xlFlow...", ...
these are actually integers from #define statements in the .H file.  I've
used these as selectors in my "record case ..." statements (and declared
them as "const" in my pascal source) and eliminated them from the comments.
2) A nice compare and contrast:  Had microsoft put the xltype word (which is
at the end of the structure "xloper") first, I could have used it in my case
selector as in "record case xltype:word of...",  the two bytes that xltype
occupies would become somewhat of a runtime type selector (a definite pascal
advantage) but on the other hand, by putting it at the end, the same address
of this data item can directly typecast to one of the union's member types
once xltype has been examined (you do it by hand...) a C advantage (unless
you are using Borland Pascal :).  3) Since Pascal does not allow "unions
within unions" or "variants of variants" I've declared each sub-union
(variant) as a separate type, which is legal pascal.  Same effect.  4) I've
taken liberties in renaming some fields to make them more readable for me :}
5) The C version is 88 lines long, the Pascal one is 85.  /*could it be the
three lines I deleted from the comments???*/
Trên C
Mã:
*******************c version*****************************************

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

typedef struct xlref
{
    WORD rwFirst;
    WORD rwLast;
    BYTE colFirst;
    BYTE colLast;
} XLREF, FAR *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, FAR *LPXLMREF;


/*
** 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 */
        WORD bool;                      /* xltypeBool */
        WORD err;                       /* xltypeErr */
        short int w;                    /* xltypeInt */
        struct
        {
            WORD count;                 /* always = 1 */
            XLREF ref;
        } sref;                         /* xltypeSRef */
        struct
        {
            XLMREF far *lpmref;
            DWORD idSheet;
        } mref;                         /* xltypeRef */
        struct
        {
            struct xloper far *lparray;
            WORD rows;
            WORD columns;
        } array;                        /* xltypeMulti */
        struct
        {
            union
            {
                short int level;        /* xlflowRestart */
                short int tbctrl;       /* xlflowPause */
                DWORD idSheet;          /* xlflowGoto */
            } valflow;
            WORD rw;                    /* xlflowGoto */
            BYTE col;                   /* xlflowGoto */
            BYTE xlflow;
        } flow;                         /* xltypeFlow */
        struct
        {
            union
            {
                BYTE far *lpbData;      /* data passed to XL */
                HANDLE hdata;           /* data returned from XL */
            } h;
            long cbData;
        } bigdata;                      /* xltypeBigData */
    } val;
    WORD xltype;
} XLOPER, FAR *LPXLOPER;
Trên Delphi
Mã:
*******************pascal version************************************
*)

{*
** XLREF structure
** Describes a single rectangular reference
*}
type
    xlref_ptr  = ^xlref_type;
    xlref_type = record
        FirstRow    : word;
        LastRow     : word;
        FirstCol    : byte;
        LastCol     : byte;
    end;

{*
** XLMREF structure
** Describes multiple rectangular references.
** This is a variable size structure, default
** size is 1 reference.
*}
type
    xlmref_ptr   = ^xlmref_type;
    xlmref_type  = record
        count   : word; {count will never be more than 30 according to doc}
        xlrefs  : array[1..32] of xlref_type;
    end;

{*
** XLOPER structure
** Excel's fundamental data type: can hold data
** of any type. Use "R" as the argument type in the
** REGISTER function.
**}
type
    flowarg_type = record case integer of
        xlFlowRestart   : ( level   : integer; );
        xlFlowPause     : ( tbctrl  : integer; );
        xlFlowGoto      : ( SheetId : longint; );
    end;

type
    handle_type = record case integer of
        1 : ( buff : pointer );  {*data passed to XL*}
        2 : ( hand : record      {*data returned from XL*}
                offset   : word;
                selector : word;
              end; );
    end;

type
    xloper_ptr  = ^xloper_type;
    xloper_type = record
        val : record case word of
            xlTypeNum     : ( num  : double;  );
            xlTypestr     : ( str  : ^string; );
            xlTypeBool    : ( bool : word;    );
            xlTypeErr     : ( err  : word;    );
            xlTypeInt     : ( int  : integer; );
            xlTypeSref    : ( sref : record
                                count   : word; {*always=1*}
                                xlref   : xlref_type;
                              end; );
            xlTypeRef     : ( mref : record
                                xlmref  : xlmref_ptr;
                                SheetId : longint;
                              end; );
            xlTypeMulti   : ( xlarray : record
                                xloper  : xloper_ptr;
                                rows    : word;
                                cols    : word;
                              end; );
            xlTypeFlow    : ( flow : record
                                flowarg : flowarg_type;
                                row     : word;
                                col     : byte;
                                xlflow  : byte;
                              end; );
            xlTypeBigdata : ( bigdata : record
                                handle  : handle_type;
                                len     : longint;
                              end; );
        end;
        xltype : word;
    end;
Tham khảo thêm
 
Lần chỉnh sửa cuối:

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,312
Được thích
543
Điểm
860
App := GetActiveOleObject('Excel.Application');

Làm gì có server Excel nào đang hoạt động mà đòi Get?
em test GetActiveOleObject('Excel.Application'); trên Excel 16, Excel đang hoạt động mà nó cũng không lấy được IDispatch anh, nó báo lỗi EOleSysError:Operation unavailable
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,312
Được thích
543
Điểm
860
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
em cũng bị Memory Leak.
 
Top Bottom