Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 23 kết quả

Đề tài: Exec: Lib, Dll and Exe

  1. #1
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    Mặc định Exec: Lib, Dll and Exe

    B0: tham khảo
    http://diendan.congdongcviet.com/threads/t447706::van-de-su-dung-de-quy-de-them-dau-sao-vao-giua-cac-ky-tu-trong-chuoi.cpp

    Không phải lúc nào cũng cần chi li, mẫn cán viết hết cốt kiếc để tạo exe.
    Theo OPP, ta có thể tạo thư viện, dùng lại cho nhiều ứng dụng, và che giấu (hide) việc cài đặt.

    B1: thực hiện cho topic trên
    + A tạo thư viện lib và dll
    C Code:
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. char* Loop(char* src, int n){  
    5.     const char whs = ' ';
    6.     char* dst = new char[2 * n - 1];
    7.     dst[0] = src[0];
    8.    
    9.     int k = 1;
    10.     for( int i = 1; i < n; i++){
    11.         if( src[i] != whs && src[i - 1] != whs)
    12.             dst[k++] = '*';
    13.         dst[k++] = src[i];
    14.     }
    15.    
    16.     dst[k] = 0;
    17.     return dst;
    18. }
    19.  
    20. extern "C" __declspec(dllexport) char* allStar(char* src){//last char is '\n'
    21.     int n = strlen(src);
    22.     if(n < 2) return src;  
    23.     return Loop(src, n - 1);
    24. }
    25.  
    26. BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){
    27.     switch(fdwReason){
    28.         case DLL_PROCESS_ATTACH:
    29.            puts("===In DLL_PROCESS_ATTACH===\n");
    30.            /*
    31.            CheckIn - Init
    32.            */
    33.            break;
    34.         case DLL_PROCESS_DETACH:
    35.            puts("\n===In DLL_PROCESS_DETACH===");
    36.            /*
    37.            CheckOut - Release
    38.            */
    39.            break;
    40.     }
    41.     return TRUE;
    42. }

    + B tạo ứng dụng exe
    C Code:
    1. //header - interface
    2. extern "C" __declspec(dllimport) char* allStar(char* src);
    3.  
    4. #include <iostream>
    5. using namespace std;
    6.  
    7. int main(){
    8.     char a[100];
    9.     cout << "input string: ";
    10.     fgets(a, 100, stdin);
    11.  
    12.     cout << allStar(a) << endl;
    13.     //cout << "\nDone, bye.";
    14.    
    15.     return 0;
    16. }

    biên dịch chạy, như sau:
    Dos Code:
    1. F:\Yr2019\cpp\dLibs\Test\Binn>Exec
    2. ===In DLL_PROCESS_ATTACH===
    3.  
    4. input string: abc hello
    5. a*b*c h*e*l*l*o
    6.  
    7. ===In DLL_PROCESS_DETACH===

    Lúc thuận tiện nói tiếp.

  2. #2
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    Không dùng tới khái niệm cao xiêu như địa chính trị - namespace, lớp - class, tầm vực - scope (private, protected , internal , public) ...

    Nó tạm đủ để che (hide) việc cài đặt


    Nó được đề cập nhiều trong sgk, giáo trình; ai ai cũng biết khi học i tờ.

    PS: OPP, ở trên bị lỗi đánh máy, vui lòng sửa lại OOP, Object-oriented programming.

  3. #3
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    B2: biên dịch có thể dùng một trong nhiều cách khác nhau, trong IDE - VS, bằng MsBuild.exe hay command line tools.

    lib file như trên dùng cho việc liên kết biên dịch; dll thì cần cho quá trình chạy của exe, nó có thể đặt đâu đó miễn sao exe có thể liên hệ được, không nhất thiết cùng thư mục.

  4. #4
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    Những ngôn ngữ khác thường xây dựng sẵn nhiều hàm nhập/xuất, thay đổi thời gian, ví dụ
    https://docs.microsoft.com/en-us/dotnet/api/system.datetime.op_addition?view=netcore-3.1

    Thử xây dựng hàm cộng addDays, chạy thử:
    C Code:
    1. extern "C" __declspec(dllimport) int addDays(int* d, int* m, int* y, int nDay);
    2.  
    3. #include <stdio.h>
    4.  
    5. int main() {
    6.     int after;
    7.     int dd, mm, yy;
    8.     //prompt user for date
    9.     printf("Enter date (dd/MM/yyyy): ");
    10.     scanf("%d/%d/%d", &dd, &mm, &yy);
    11.     //
    12.     printf("After day: ");
    13.     scanf("%d", &after);
    14.     //call lib
    15.     addDays(&dd, &mm, &yy, after);
    16.     //output result
    17.     printf("That day is %02d/%02d/%d", dd, mm, yy);
    18. }
    Hình chụp:

    code đính kèm
    ...
    ..
    .
    Attached Files Attached Files

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    + TvLib là thư viện hỗ trợ việc hiện thị, nhập xuất cho chương trình Windows Console (Windows 7, Windows 10), theo tiêu chí What you see is what you get (WYSIWYG).

    + Windows Console (winCon) có hạn chế trong việc hiện thị Unicode,
    - các hàm đọc (gets/read) nhận không đúng dữ liệu wide string,
    - các hàm viết (puts/write) xuất sai, bao gồm dữ liệu là hằng chuỗi (string literal)
    dẫn đến ứng dụng (console applications, conApp) không đáp ứng được cho người dùng sử dụng Unicode.

    + Ngôn ngữ tiếng Việt sử dụng chữ Quốc ngữ trong giao tiếp. Bộ chữ cái tiếng Việt thuộc Unicode vì có nhiều kí hiệu nằm ngoài bảng mã ASCII/ANSI.

    + Ngôn ngữ lập trình (NNLT) cơ sở thường bắt đầu bằng các bài học trên winCon, tạo conApp.
    + Những hạn chế trên dẫn đến khó khăn cho người sử dụng tiếng Việt (UTF hay Unicode nói chung) trong lập trình, trong công nghệ thông tin. Bỏ thói quen đã có, viết đầy đủ (có dấu) sang viết / gõ dạng "chu Viet khong dau" - chữ Việt không dấu khó viết, khó đọc, sai lệch nội dung diễn đạt. Hình thành thói quen xấu khi khởi đầu, ảnh hưởng tới những bước tiếp theo trong học tập, đến công việc sau này.
    + NNLT c/c++ được sử dụng phổ biến ở Việt Nam, được giới thiệu ở cấp phổ thông và dạy ở bậc đại học. Trình biên dịch (TBD) thường dùng cho c/c++ là Msc, Gcc và Bcc.

    + TvLib hỗ trợ - mã nguồn c++ sau khi biên dịch (với Msc, Gcc và Bcc) thành conApp - có thể hiện thị được, nhập xuất được tiếng Việt, ngôn ngữ phổ thông thân thiện với hầu hết người Việt Nam.
    + TvLib bổ xung hàm thiết lập hiện thị, nhập xuất và chuyển đổi giữa wide và narrow string, cụ thể là wstring và string STL (Standard Template Library).
    + TvLib có một số code demo diễn tả hoạt động của nó.

    + Mã nguồn TvLib được viết chung cho Msc, Gcc và Bcc - không có macro phân biệt, chỉ khác lệnh biên dịch để sinh thư viện (LIB và DLL) dùng cho mỗi TBD. Khi tách ra có thể sẽ ngắn gọn hơn cho mỗi TBD, ví dụ hàm printf (narrow functions) của Msc xuất được ký hiệu unicode có trong chuỗi thay vì dùng API.
    + TvLib không cung cấp mã nguồn cho người dùng cuối.

    + TBD Msc, Gcc và Bcc xử lý, ứng xử khác nhau với source code chứa hằng chuỗi wstring. Gcc và Bcc hỗ trợ Utf-8 (hasBOM/nonBOM) nhưng Msc lại phân biệt. Msc hỗ trợ Utf-16 nhưng Gcc và Bcc thì không.
    + Ví dụ hằng chuỗi chứa ký hiệu unicode:
    - Với Msc là hợp lệ (dạng UTF-8) có thể gán cho biến string (narrow), (Utf-8 BOM dùng cho mã nguồn chứa ký hiệu unicode dùng với hàm wide functions, ví dụ wprintf)
    - Gcc và Bcc vẫn nhìn nó là wide, cần thêm tiền tố L, chỉ gán được cho wstring (wide).

    + Những bộ gõ tiếng Việt có thể dùng cho winCom hiện nay khá phổ biến, ví dụ GoTiengViet, EVKey và UniKey.

    + Mong được cộng tác và góp ý của các bạn.
    ...
    ..
    .
    - Gcc và Bcc vẫn nhìn nó là wide, cần thêm tiền tố L, chỉ gán được cho wstring (wide).
    là không chính xác, hằng chuỗi chứa ký hiệu unicode có thể khởi tạo hay gán cho biến string (narrow), nhưng biến được gán không bảo toàn thông tin đã gán.
    ...
    ..
    .
    Đã được chỉnh sửa lần cuối bởi Monre : 28-07-2021 lúc 12:52 AM.

  6. #6
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    986

    Mặc định Exec: Lib, Dll and Exe

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    + Mong được cộng tác và góp ý của các bạn.
    Có phải TvLib có trong Ymd.rar ở #4 ?
    .
    .

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    TvLib có thể tải từ Link Google (drive):
    Thư Viện TvLib

    hoặc thành viên trong diễn đàn đăng nhập:
    TvLib thư viện nhập xuất tiếng Việt cho Windows Console
    ...
    ..
    .

  8. #8
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    Trên #5, của bài viết này:
    - Gcc và Bcc vẫn nhìn nó là wide, cần thêm tiền tố L, chỉ gán được cho wstring (wide).

    là sai, không chính xác, hằng chuỗi chứa ký hiệu unicode có thể khởi tạo hay gán cho biến string (narrow), nhưng biến được gán không bảo toàn thông tin đã gán.

    ví dụ với Bcc:
    C++ Code:
    1.     wstring ws( L"Quốc ngữ tiếng Việt." );
    2.     string ss (  "Quốc ngữ tiếng Việt." ); //Utf8: Quß╗æc ngß╗» tiß║┐ng Viß╗çt.
    3.     //...
    ...
    ..
    .

  9. #9
    Ngày gia nhập
    01 2014
    Bài viết
    44

    Như thế này thì sẽ xuất ra đúng:

    Code:
    string ss{u8"Quốc ngữ tiếng Việt."};

  10. #10
    Ngày gia nhập
    08 2017
    Bài viết
    4,091

    Trích dẫn Nguyên bản được gửi bởi huycan Xem bài viết
    Như thế này thì sẽ xuất ra đúng:

    Code:
    string ss{u8"Quốc ngữ tiếng Việt."};
    Đúng là đúng chỗ nào?
    Sao lại tin tài liệu bá vơ trên mạng!

    Một số ngôn ngữ nằm trong ASCII thì viết dạng utf-8 hay utf-16 nó như nhau về mặt data, wstring thì phí kích thước hơn tí so với string.
    Tiếng Việt thì khác:
    C Code:
    1. /*
    2. bcc32c -q TvUtf.cpp
    3. */
    4.  
    5. #include <stdio.h>
    6.  
    7. #include <iostream>
    8. using namespace std;
    9.  
    10. int main(){
    11.     string tt(u8"Quốc ngữ tiếng Việt."); //# has prefix
    12.     string vv(  "Quốc ngữ tiếng Việt."); //# not
    13.    
    14.     printf("\n\n-. Check data ...");   
    15.    
    16.     bool eq = true;
    17.     int sz = vv.size();
    18.     if( sz != tt.size()) eq = false;
    19.     else for( int i = 0; i < sz; i++){
    20.         if(vv[i] != tt[i]){
    21.             eq = false; break;
    22.         }
    23.     }
    24.     //
    25.     if(eq) printf("\n\t + tt and vv are EQUAL");
    26.     else if(eq) printf("\n\t + tt and vv are NOT-EQUAL");  
    27. // 
    28.     printf("\n\n-. Done, Bye .. "); system("pause>nul");   
    29.     return 0;
    30. }
    bạn có thể tự kiểm lại code trên

    Sử dụng hàm chuyển của TvLib để minh hoạ rõ hơn, dù tôi không khẳng định hàm chuyển w2s, s2w luôn đúng
    C++ Code:
    1. /*
    2. bcc32c -q utf_ucs.cpp TvLibBcc.lib
    3. */
    4.  
    5. #include "..\TvLib.h"
    6.  
    7. int main(){
    8. //# setFont for conApp?
    9.     setFont();
    10.     system("cls");
    11.    
    12.     printf("\n-1. Run Console Windows ...\n"); 
    13.     printf("\n-2. Test converts ..."); 
    14. //1. OK: ucs => uft => ucs
    15.     wstring ws(L"Quốc ngữ tiếng Việt.");
    16.     char * chs = w2s(ws);  //#  
    17.     PWCHAR ucs = s2w(chs); //#  
    18.    
    19.     WCHAR kqA[] = L"\n + Result 1, ucs to utf: %ls"; //# s narrowString
    20.     OutFmtW(kqA, chs); 
    21.     OutMsg(L"\n + Result 2, utf to ucs: %ls", ucs); //# ls largeString
    22.    
    23. //2. OK: ucs => uft => utf 
    24.     string ss( w2s(ws) );  
    25.     ucs = s2w(ss);   //#ss
    26.     chs = w2s(ucs);  //#  
    27.    
    28.     WCHAR kqB[] = L"\n\n + Result 3, ucs to utf: %ls"; //# s narrowString
    29.     OutFmtW(kqB, chs); 
    30.     OutMsg(L"\n + Result 4, utf to ucs: %ls", ucs); //# ls largeString
    31.    
    32. //3. wrong: uft => ucs !!
    33.     //string tt(u8"Quß╗æc ngß╗» tiß║┐ng Viß╗çt."); //utf8
    34.     string tt(u8"Quốc ngữ tiếng Việt.");
    35.     ucs = s2w(tt);   //#ss
    36.     //# chs = w2s(ucs);  //#  
    37.  
    38.     WCHAR kqC[] = L"\n\n + Result 5, ucs to utf: %ls"; //# s narrowString
    39.     OutFmtW(kqC, tt.c_str()); //# chs  
    40.     OutMsg(L"\n + Result 6, utf to ucs: %ls", ucs); //# ls largeString
    41.    
    42. //4. checking ...
    43.     printf("\n\n-3. Check data ...");  
    44.     string vv( "Quốc ngữ tiếng Việt."); //# wrong?
    45.     bool eq = true;
    46.     int sz = vv.size();
    47.     if( sz != tt.size()) eq = false;
    48.     else for( int i = 0; i < sz; i++){
    49.         if(vv[i] != tt[i]){
    50.             eq = false; break;
    51.         }
    52.     }
    53.     //
    54.     if(eq) printf("\n + tt and vv are EQUAL");
    55.     else if(eq) printf("\n + tt and vv are NOT-EQUAL");
    56. /*
    57. */
    58.     printf("\n\n-4. Done, Bye .. "); system("pause>nul");  
    59.     return 0;
    60. }

    Kết quả của nó, 1 và 2 giống 3 và 4 nhưng khác với 5 và 6:

    ...
    ..
    .

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn