Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
Viết DLL = Delphi cũng có nhiều chiêu, tips nho nhỏ. Ví dụ không phải chỉ export được hàm/procedure, mà có thể export cả biến, kiểu record, pointer, object..., cách thưc hiện các code ở DllMain proc.
Tặng bạn Mạnh 1 code tui code cho IDA plugin, port từ C/C++ qua Delphi, export 1 biến kiểu record, và dùng API để search, patch memory của application mẹ.
Code này chỉ chạy đúng trên app 32bit thôi nhé, 64 bit phải sữa lại vài điểm nhỏ. Hì hì, trên chục năm rồi, từ thời IDA v6.1, giờ nó lên tới 7.3 rồi.
Viết DLL = Delphi cũng có nhiều chiêu, tips nho nhỏ. Ví dụ không phải chỉ export được hàm/procedure, mà có thể export cả biến, kiểu record, pointer, object..., cách thưc hiện các code ở DllMain proc.
Tặng bạn Mạnh 1 code tui code cho IDA plugin, port từ C/C++ qua Delphi, export 1 biến kiểu record, và dùng API để search, patch memory của application mẹ.
Code này chỉ chạy đúng trên app 32bit thôi nhé, 64 bit phải sữa lại vài điểm nhỏ. Hì hì, trên chục năm rồi, từ thời IDA v6.1, giờ nó lên tới 7.3 rồi.
đang coi qua coi lại mà không biết xài nó như thế nào và ứng dụng vào thực tế của Mạnh ra làm sao ???!!!
Cho mạnh rồi thì chỉ cho Mạnh học cách xài nó và ứng dụng nó ... nếu được bạn có thể điều chỉnh viết lại code cho nó sử dụng được cả trên 32 & 64 được không ?
Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn. Loạt video hướng dẫn lập trình Delphi cơ bản của mình tại đây...
Mà bạn có đọc các vd. của Delphi, tìm kiếm trên mạng? Không có chỗ nào bạn thấy trường hợp một unit sử dụng một unit khác? Thế thì bạn may mắn đấy. Người khác "va chạm" với nó thường xuyên. Còn bạn "vọc" khá lâu mà không gặp thì cũng lạ.
Ngoài các unit của Delphi thì bạn có thể có những unit của mình chứ. Nếu không thì sao Delphi lại cho bạn khả năng thêm unit mới và viết code cho unit ấy??? Mà khi có rồi thì không phải để đấy làm cảnh. Mà muốn dùng thì cho vào uses thôi.
Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn. Loạt video hướng dẫn lập trình Delphi cơ bản của mình tại đây...
Mà bạn có đọc các vd. của Delphi, tìm kiếm trên mạng? Không có chỗ nào bạn thấy trường hợp một unit sử dụng một unit khác? Thế thì bạn may mắn đấy. Người khác "va chạm" với nó thường xuyên. Còn bạn "vọc" khá lâu mà không gặp thì cũng lạ.
Ngoài các unit của Delphi thì bạn có thể có những unit của mình chứ. Nếu không thì sao Delphi lại cho bạn khả năng thêm unit mới và viết code cho unit ấy??? Mà khi có rồi thì không phải để đấy làm cảnh. Mà muốn dùng thì cho vào uses thôi.
Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn. Loạt video hướng dẫn lập trình Delphi cơ bản của mình tại đây...
Mà bạn có đọc các vd. của Delphi, tìm kiếm trên mạng? Không có chỗ nào bạn thấy trường hợp một unit sử dụng một unit khác? Thế thì bạn may mắn đấy. Người khác "va chạm" với nó thường xuyên. Còn bạn "vọc" khá lâu mà không gặp thì cũng lạ.
Ngoài các unit của Delphi thì bạn có thể có những unit của mình chứ. Nếu không thì sao Delphi lại cho bạn khả năng thêm unit mới và viết code cho unit ấy??? Mà khi có rồi thì không phải để đấy làm cảnh. Mà muốn dùng thì cho vào uses thôi.
Từ ngày Em vào Nam đến giờ 20 Năm rồi vẫn ở cái nhà đó, ngõ đó, đường đó thế mà có người hỏi Em nhà Anh ở đường nào Em keo ko biết ... chỉ biết cổng 16 - dĩ an - bình dương
hàng ngày Em vẫn coi code Delphi vẫn Add thêm Unit để viết code mới và sử dung nó ... thế mà đùng 1 cái hỏi nó mới ghê
Tại em thấy khi em thêm 1 cái Unit thì trong Delphi tự động nó sinh ra như vầy trong Uses: ADO_Excel in 'ADO_Excel.pas',
còn bài 259 Anh chỉ Em như vậy mà em học xong quên mất tiêu ... giờ em lại nhớ tránh tham chiếu vòng vv ...
Còn thấy cái đó khai báo ngắn gọn vậy nên lại nhầm nhọt sang trồng trọt ..........
quả là code két diết nhớ nhớ xong quên quên nó làm đơ người ra đó Anh
Trong VBA có hàm TypeName() để lấy tên của class hay tên của lớp khai báo control hay các object. Khi các bạn lập trình Delphi cho Excel muốn dùng hàm TypeName không thể được vì nó không cùng môi trường VBA. Giải pháp chúng ta phải biết hàm API nào trong thư viên VBAxxx xuất nó ra đồng thời phải biết tham số để sử dụng. Chúng ta thực sự khó nếu không có tài liệu cung cấp từ nhà lập trình ra vbaxxx.
Nhân chủ đề Undocument API VBA ở bài số #10 tại đây
Cái laptop hư lâu lắc, phải gởi vào thành hồ chứa mưa sữa, mới lấy về. Nên quay lại tiếp với cái gọi là "rờ chxx em" Windows và VBA. Topic này tui sẽ đăng lần lượt những gì cu anh tui phát hiện ra trong quá trình "rờ em" Windows API, DLLs và VBAxxx.dll. Các tips, tricks này sẽ bảo đảm không có...
www.giaiphapexcel.com
Code mà bác CU Anh moi ra nó là C và rất phức tạp đây:
Điều quan trọng là bác @ThangCuAnh đã giúp lấy được tên hàm API của hàm TypeName cùng prototype, tôi viết lại code để chúng ta dùng trong Delphi như sau.
1. Các bạn thao khảo cách dùng bên VB/VBA (mang tính học tập vì trong VBA hàm TypeName đã có.
Option Explicit
#If VBA7 Then
Declare PtrSafe Function rtcTypeName Lib "VBE7.DLL" (v As Variant) As String
#Else
Declare Function rtcTypeName Lib "VBE6.DLL" (v As Variant) As String
#End If
Sub TestTypeNameAPI()
Dim sName As String
sName = rtcTypeName(ActiveCell)
MsgBox StrConv(sName, vbFromUnicode)
End Sub
2. Cách khai báo API hàm rtcTypeName() để dùng trong Delphi. Nếu chúng ta tạo Add-in thì đây là tư liệu quý.
Code dưới đây tôi viết trong chương trình chính dạng Console (màn hình đen trắng). Các bạn làm trình tự như sau.
1. Từ Delphi, tạo application dạng Console (nếu ai có add-in rồi thì chỉ cần code chính của nó).
2. Paste đoạn code dưới đây.
3. Chạy Excel với quyền "Run as administrator"
4. Chạy progam trong Delphi (F9)
Mã:
program Test_VBA_API.dproj;
//This code call function API in VBAxxx "rtcTypeName()". In VBA its name is TypeName()
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows,
ComObj,
System.Variants;
type
TFuncVBAPI_rtcTypeName = function(var v: OleVariant): PWideChar; stdcall;
var sName: WideString;
h: HMODULE;
pFunc: TFuncVBAPI_rtcTypeName;
App: OleVariant;
v: OleVariant;
begin
try
App := GetActiveOleObject('Excel.Application');
Writeln('Ung dung da ma la', ': ', App.Name);
h := LoadLibrary('C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7\VBE7.DLL');
try
pFunc := GetProcAddress(h, 'rtcTypeName');
v := App.ActiveCell;
sName := PWideChar(TFuncVBAPI_rtcTypeName(pFunc)(v));
Writeln('Gia tri bien la', ': ', sName);
finally
FreeLibrary(h);
App := Unassigned;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Trong VBA có hàm TypeName() để lấy tên của class hay tên của lớp khai báo control hay các object. Khi các bạn lập trình Delphi cho Excel muốn dùng hàm TypeName không thể được vì nó không cùng môi trường VBA. Giải pháp chúng ta phải biết hàm API nào trong thư viên VBAxxx xuất nó ra đồng thời phải biết tham số để sử dụng. Chúng ta thực sự khó nếu không có tài liệu cung cấp từ nhà lập trình ra vbaxxx.
Nhân chủ đề Undocument API VBA ở bài số #10 tại đây
Cái laptop hư lâu lắc, phải gởi vào thành hồ chứa mưa sữa, mới lấy về. Nên quay lại tiếp với cái gọi là "rờ chxx em" Windows và VBA. Topic này tui sẽ đăng lần lượt những gì cu anh tui phát hiện ra trong quá trình "rờ em" Windows API, DLLs và VBAxxx.dll. Các tips, tricks này sẽ bảo đảm không có...
www.giaiphapexcel.com
Code mà bác CU Anh moi ra nó là C và rất phức tạp đây:
Điều quan trọng là bác @ThangCuAnh đã giúp lấy được tên hàm API của hàm TypeName cùng prototype, tôi viết lại code để chúng ta dùng trong Delphi như sau.
1. Các bạn thao khảo cách dùng bên VB/VBA (mang tính học tập vì trong VBA hàm TypeName đã có.
Option Explicit
#If VBA7 Then
Declare PtrSafe Function rtcTypeName Lib "VBE7.DLL" (v As Variant) As String
#Else
Declare Function rtcTypeName Lib "VBE6.DLL" (v As Variant) As String
#End If
Sub TestTypeNameAPI()
Dim sName As String
sName = rtcTypeName(ActiveCell)
MsgBox StrConv(sName, vbFromUnicode)
End Sub
2. Cách khai báo API hàm rtcTypeName() để dùng trong Delphi. Nếu chúng ta tạo Add-in thì đây là tư liệu quý.
Code dưới đây tôi viết trong chương trình chính dạng Console (màn hình đen trắng). Các bạn làm trình tự như sau.
1. Từ Delphi, tạo application dạng Console (nếu ai có add-in rồi thì chỉ cần code chính của nó).
2. Paste đoạn code dưới đây.
3. Chạy Excel với quyền "Run as administrator"
4. Chạy progam trong Delphi (F9)
Mã:
program Test_VBA_API.dproj;
//This code call function API in VBAxxx "rtcTypeName()". In VBA its name is TypeName()
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows,
ComObj,
System.Variants;
type
TFuncVBAPI_rtcTypeName = function(var v: OleVariant): PWideChar; stdcall;
var sName: WideString;
h: HMODULE;
pFunc: TFuncVBAPI_rtcTypeName;
App: OleVariant;
v: OleVariant;
begin
try
App := GetActiveOleObject('Excel.Application');
Writeln('Ung dung da ma la', ': ', App.Name);
h := LoadLibrary('C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA7\VBE7.DLL');
try
pFunc := GetProcAddress(h, 'rtcTypeName');
v := App.ActiveCell;
sName := PWideChar(TFuncVBAPI_rtcTypeName(pFunc)(v));
Writeln('Gia tri bien la', ': ', sName);
finally
FreeLibrary(h);
App := Unassigned;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
Vâng, viết thế chuẩn đó anh. Vì code trước em test để khai báo pFunc: TFarProc; nên lúc dùng thì lại bao lớp cấu trúc hàm, sau em chỉnh ở trên thì dưới lại chưa chình a.
Thôi thôi bác Tuân ơi, InStr với InStrRev ẹ lắm, dài dòng, chậm, không bằng mấy hàm PChar của Delphi đâu. Bác tính dùng cho việc gì ?
Nó là 3 hàm rtcInStr, rtcInStrRev với rtcInStrChar đó.
Hầu như 100% các hàm của VBA đều được export hết đó bạn Tuân.
Thôi thôi bác Tuân ơi, InStr với InStrRev ẹ lắm, dài dòng, chậm, không bằng mấy hàm PChar của Delphi đâu. Bác tính dùng cho việc gì ?
Nó là 3 hàm rtcInStr, rtcInStrRev với rtcInStrChar đó.
Hầu như 100% các hàm của VBA đều được export hết đó bạn Tuân.
Vâng. Hàm InStr có thể dùng bởi hàm Pos hoặc PosEx cảu Delphi rất nhanh, code nguồn Delphi hàm Pos() viết bằng Assemble rất ngọt. Tuy nhiên hàm InStrRev Delphi không viết giúp, mình phải tự viết và dùng vòng lặp và duyệt PChar nên cảm thấy chưa ưng. Nếu lấy được InStrRev em sẽ test để so sánh tốc độ với Delphi. Khi viết Delphi cho Office thì cứ thằng nào ngon nhất ta dùng. Ý em là vậy đó bác .
Hạn chế dùng mấy hàm và kiểu string của Delphi bác Tuân ơi, chậm lắm, dùng các hàm và trực tiếp trên kiểu PChar luôn. Vd StrPos, StrScan, StrRScan...
Dùng kiểu string, compiler của Delphi phải nhét rất nhiều code của các hàm internal vào, chuyển kiểu, thao tác ngầm trong đó.
Bác Tuân, bác Mạnh bật option build with debug dcu đi, debug vào từng lệnh 1 sẽ thấy. Nightmare đó.