{*******************************************************} { } { STLabGuardModule } { } { Copyright (C) 2024 kku } { } {*******************************************************} unit STLabGuardModule; interface uses Winapi.Windows, System.SysUtils; const {$IFDEF Win64} DLL_ST = 'LabGuard_Layer_x64.dll'; {$ELSE} DLL_ST = 'LabGuard_Layer_x86.dll'; {$ENDIF} // poc_labcurity_S.txt - for 현대자동차 TEST // 2024-05-21 ~ 2024-06-31 // ST_Key_S = 'ISD5vgWXTGX0tJw+7U/HkoVG7CbZuQ0aH4BRTBsuR21HRpNEPOgCZ21f5BETa3vJxM' + // 'KCsVZJcUmZQAx5g8lz2WFS/nXP5kInSpmkiIYGmnNL7u3Ug85Zr0aEyLW9XruSt1Lb' + // 'jXoCz3JEyS2r5ot6M41HLCecrB9Ma98wdzJHe7/vHWW9JlRrc297VkdFgVrBIt60pb' + // 'XCxT6JNQV4/PN5bvppAJ9ZH9ku3OhZ2cBQ39W0GbhSp5v5t/hpuptxiohDkpoWtjYQ' + // 'xrwOLDnqeK1IYNQ/d2z1jkao4Qk2deME4QgxJGZ6T62J9srVXhVWVPJMwejWUHtbLt' + // '8LOS8e3JXBG0vn8dJlM6Gkhr97+UM9++xneUq756h0Om/fOyd1OK/AyGwKqC1uLZNk' + // 'XN65O/UZjg/7ZhPdhPJetfoaG9MZI+olghbot4qfHQy3Skqjj9nr1/fpT6E/4M0evk' + // 'rJRkoBFx1w0u35vbzWGUD4R3x6nvPA34xu1d5Uh+4PIMHiArlYXUVTBoxALa0VIWwE' + // 'Bu0LUZgXU8jDsimrhQ6o/1l+QXJI+Tv+OfJj09nImN05Y7rzVAM/gjrjLmBsoy4VUP' + // 'KAHzQnOetAGJ2y/W5Y7ZJr6NF02i6SVWmvDxnnE/sq6/tpB45D5emp5H6TJJII7vXv' + // 'aWifP0iCIOb5OY/+UYD+5Bt7GY+BOHPoWf4R7WzBlDY9RVvX0Z77Of8PxRIdH9SgGz' + // '1TaDF/wchBsegWN6U6S6iLI5TzCiPB2vsEHIx/iYa8E6WT8MtdbM5YoSmJHjXcDj1Y' + // 'Pa33ZwZEiDjEtO4LErwKp9P1ZjbdfE4zeFyX+p5oNLwAUxADyPLM3eWYcWxs4Q=='; // SK하이닉스 PoC 2024-05-21 ~ 2024-10-07 ~ ? // ST_Key_S = 'ISD5vgWXTGX0tJw+7U/HkoVG7CbZuQ0aH4BRTBsuR21HRpNEPOgCZ21f5BETa3vJ+w' + // 'rapbTKSMChvHUSlhprcvZMPM/WGOP+M+Ip+372IPzrCTO2hcTw1txOiH6UN3WyHMNi' + // 'L9KDdDJt4NsUJT417nbItjP/epctTBXlRloRmUyG00pH/S6eY0JmWXmW/qkmxfsVp+' + // 'GkASmohf8nsRk9ZCHNM1E6NZ9sLNrB+LgF+pysyTcypuV1qoRDEfU/TG0zqb/MGjoS' + // 'bL6t3+bYKaheORqyo9NAuTDFArc6y2T5gU+nktS2LeUASVm7ZleXsd0opDWpqfo1ks' + // 'hM2/0lS9C58nhVdO67O2TZfvQdRh3oZCbosCUzEHRz9UnscjewnKP5IfAttn8iCm2k' + // '46DmTVEstpidwHV9zBN1BIxVnQtSBpUDMWIRcCQP48Q7vgg//mTOTPnsUeVdIvUocX' + // 'mW4y0DjwPERiWIiWM9GtBNoBHB5LBx1F2yZRmF+tgeYgXYT/b47zVQAhb8Pb/C7oSo' + // 'JMl2QTH/dj/XE6hv+qZLVbeJaKsoEZl66VKzqj9X4VBpOfEoGBGld2Z9jXN3JTDBtK' + // 'veNoV/0fZx1d89Ppkab1gN+ztWWWlTo6EihCdZA/UD0p+WwFY5eRvh22PfQQ+IfJDA' + // 'TwWz6Rb2G/84bjrToS7OBYGoD+H2O4C6Vsw3i6rg8UJFCnc6Ape8Odqoy/8Bp5X9ht' + // '+LSddJjALA9Rbhyzlkfdi9k3SGyRHHodZ8KrCypEnlVorMG3GVWavEfVzWGpExZXSu' + // 'KzJBABfru4odgEpa+tcbcqqnhM222Iij5IBpn6Nf'; // ?? // ST_Key_S = 'ISD5vgWXTGX0tJw+7U/HkglGMoHrmlmdZwcGzmrVJ4BKdt4mJgTaJjBHBiGwwcaElgmx' + // '9M+S1TsmbrN4f3mulZSad1ArstMpp0pCrhurTZ4gAfxN2ul8Ol4gt2q0rPocyAN6roMw' + // 'laA5uItr2p114R7pxF1OErHXLY1GP3UfeFAQ0oYdPc7uX2Dh4UySkP1Mi7pSgEBd5/Rq' + // 'fQzCS04OqxLt3L65MgM5k3+NuFhFfPN7Ct99YWQdAfbspVbb35R6en8mmWZdVx9uC4UI' + // 'TjvtO2eV4FlW5lCziBpOqvbDJMyve7CamioUgQNfZvN0mKTKtT1eQ4TyVyUb+bXPWATE' + // 'VKNh4WmHItDE9FYiqjwBWvJmZ25hoNm9e8HvFvUNEm56jfsW7EzITOoARt0ilDk99fLX' + // 'WNG5z4+RFfDJ+p6+iqpKkZWOElzVercx+zlKkExB6tu/5bcGgITOW8wLSX33vMnoXNGR' + // 'xp+8aq7WFHV92BLHGltVWFiVitxzXW8CR3+KPHwWbB8PmWNCeIr3T1bpKciOmJ1nuBrk' + // 'md8dLdTtGq0tt9g6aUe7rk9xq+tkd7tUyLnwaddrnuR5Yw13zrttPgsAIjyHnq8gu2I7' + // 'ZTnJNbo0Qoz1ZpK/oeCUm5Ohn7BDk795PcC5DrAkg0YV3I2WRuUhKl9/ksIRCV4OzntG' + // 'ZQxWtEg4zyeSOyQp/QYKIVPO5hJ7JvGgYuNhsy22Vemj1onHpFqdxq/aoGlFad2BREOl' + // '9ZXmX0u1qFIZ0DU/1P4XLiegCclX14LQUUox0/sjY003BjE7fF2s8Y2LI0dM6Q58UsSX' + // 'QXvxl0tdUrVnfrwrLBxsab5Pa016h2WAvgLSgPcdHgGlECTe/wqPpnhpmCVH2vO3UoC4' + // '5X05bKjjqB4Q'; // HD조선해양 PoC 25_1031 ST_Key_S = 'ISD5vgWXTGX0tJw+7U/HkglGMoHrmlmdZwcGzmrVJ4BKdt4mJgTaJjBHBiGwwcaElgmx9M' + '+S1TsmbrN4f3mulZSad1ArstMpp0pCrhurTZ4gAfxN2ul8Ol4gt2q0rPocyAN6roMwlaA5' + 'uItr2p114R7pxF1OErHXLY1GP3UfeFAQ0oYdPc7uX2Dh4UySkP1Mi7pSgEBd5/RqfQzCS0' + '4OqxLt3L65MgM5k3+NuFhFfPN7Ct99YWQdAfbspVbb35R6en8mmWZdVx9uC4UITjvtO2eV' + '4FlW5lCziBpOqvbDJMyve7CamioUgQNfZvN0mKTKtT1eQ4TyVyUb+bXPWATEVKNh4WmHIt' + 'DE9FYiqjwBWvJmZ25hoNm9e8HvFvUNEm56jfsW7EzITOoARt0ilDk99fLXWNG5z4+RFfDJ' + '+p6+iqpKkZWOElzVercx+zlKkExB6tu/5bcGgITOW8wLSX33vMnoXNGRxp+8aq7WFHV92B' + 'LHGltVWFiVitxzXW8CR3+KPHwWbB8PmWNCeIr3T1bpKciOmJ1nuBrkmd8dLdTtGq0tt9g6' + 'aUe7rk9xq+tkd7tUyLnwaddrnuR5Yw13zrttPgsAIjyHnq8gu2I7ZTnJNbo0Qoz1ZpK/oe' + 'CUm5Ohn7BDk795PcC5DrAkg0YV3I2WRuUhKl9/ksIRCV4OzntGZQxWtEg4zyeSOyQp/QYK' + 'IVPO5hJ7JvGgYuNhsy22Vemj1onHpFqdxq/aoGlFad2BREOl9ZXmX0u1qFIZ0DU/1P4XLi' + 'egCclX14LQUUox0/sjY003BjE7fF2s8Y2LI0dM6Q58UsSXQXvxl0tdUrVnfrwrLBxsab5P' + 'a016h2WAvgLSgPcdHgGlECTe/wqPpnhpmCVH2vO3UoC45X05bKjjqB4Q'; // poc_labcurity_P.txt - for 현대자동차 TEST // 2024-05-21 ~ 2024-06-31 // ST_Key_P = 'ISD5vgWXTGX0tJw+7U/HkoVG7CbZuQ0aH4BRTBsuR21HRpNEPOgCZ21f5BETa3vJxM' + // 'KCsVZJcUmZQAx5g8lz2WFS/nXP5kInSpmkiIYGmnNL7u3Ug85Zr0aEyLW9XruSt1Lb' + // 'jXoCz3JEyS2r5ot6M41HLCecrB9Ma98wdzJHe7/vHWW9JlRrc297VkdFgVrBIt60pb' + // 'XCxT6JNQV4/PN5bvppAJ9ZH9ku3OhZ2cBQ39W0GbhSp5v5t/hpuptxiohDkpoWtjYQ' + // 'xrwOLDnqeK1IYNQ/d2z1jkao4Qk2deME4QgxJGZ6T62J9srVXhVWVPJMwejWUHtbLt' + // '8LOS8e3JXBG0vn8dJlM6Gkhr97+UM9++xneUq756h0Om/fOyd1OK/AyGwKqC1uLZNk' + // 'XN65O/UZjg/7ZhPdhPJetfoaG9MZI+olghbot4qfHQy3Skqjj9nr1/fpT6E/4M0evk' + // 'rJRkoBFx1w0u35vbzWGUD4R3x6nvPA34xu1d5Uh+4PIMHiArlYXUVTBoxALa0VIWwE' + // 'Bu0LUZgXU8jDsimrhQ6o/1l+QXIVs+q87nzBJ7EcfuCGt+KZqjG1V76dJFxTdCuTs0' + // '0gPK6EV/L6wyH7MuRu3dxbmb0vrhQDn1I/wB1MZM8NXSS7A86rRjgSKj92FI0CeX4E' + // 'kfGROBAS2KQjjYimfqJIT1KvaR1HvGGCVWwF0IzkoJDKPV5OBBzXtwQPxlyoe/+BVY' + // 'tSldrdpkTrQIN+QOzhGcmKKlZtLciPB9z0a383W+TU0feofo9lrmruYIuRv64jkZYY' + // 'cNZnc2Xc8DkNphr/+tC2K7CIGeqehLr5rPEOEwkwqqGqrOJy7lxa/0SmIFQwRQ=='; // ST_Key_P = 'ISD5vgWXTGX0tJw+7U/HkoVG7CbZuQ0aH4BRTBsuR21HRpNEPOgCZ21f5BETa3vJ+w' + // 'rapbTKSMChvHUSlhprcvZMPM/WGOP+M+Ip+372IPzrCTO2hcTw1txOiH6UN3WyHMNi' + // 'L9KDdDJt4NsUJT417nbItjP/epctTBXlRloRmUyG00pH/S6eY0JmWXmW/qkmJPsWUX' + // 'Aemv6DMV/3LKO0igjt1XLSlyPoMZSmQbsSBmSpELLCQNUe/9ymTi9K6IL7fx7p2q6A' + // 'bvdIKq7BuiNrOMZxB8hkfEY5T3cgt32y3T2bOuiQGb03j0i6txy5wcIMxWn8G28bdU' + // 'KUvNrvbqbyF5dVTqeC1WQsfZWkYxzko5hyn90W+i4OGgS+zSTAOEDKCgOjp5NPPumf' + // '6igtZ7HFjQ+L0k0wJSOlmRlf4+wDk30GnJEqqjAct8Dxv5yEXjCosFeTS6KLvdR1ef' + // '/zg8FRXRhJJQKh28NOEi2k/+NBgjUruK5I4+J1C4atIJyC4XFg2yNSJvgw241pLSFY' + // 'EVrnHe2tvW9NUANqLkrvFSSckB1GnsnniuqrSSF/mBMhI2sh6wDr8HiQI6uQRduhJJ' + // 'MEm4qjPIq/SqeIm+YfMx0xKJFILjVQZKbk8gj8N2oEGdLtfcs8eTFY5nbjNnsgAeWj' + // 'yDtSkefxWGYb4IhzGa/cIMFIJigqE/XO1CNWrCeum297wvG7YqwGQpB8J6tHqU1kjX' + // 'uIwCtpOgo1rre98Why1IS8CZ0xHFUKHIvr0RCGqSMH5YP4uK9IDVWXcP0DxJD/5sKQ' + // 'mUNs287F6PquZS7nSfa7g2izrqm799RxYng1GfCsqr5K1PhEc3Ot+RvaWWOwKQ=='; // ?? // ST_Key_P = 'ISD5vgWXTGX0tJw+7U/HkglGMoHrmlmdZwcGzmrVJ4BKdt4mJgTaJjBHBiGwwcaEOXFv' + // 'WJOP5NAmC/GDK5jE0MJ+sQj8d5xIfWo23Bw+SikBlAgDD1gjEbuIzZOjxFx1XnFtPAMem6LLNWqDBQM' + // 'o41yG8UMV7HHTHV117aGIRnuYZrYyHBWV1nURp8CEOQupQY14fK7pLrMftAZ8wFbnkUoV3a15Q7q29/' + // 'iXNrCnxmK4bq19hkPaaWncwb9u+9DtL8Bn+fnzVqjxWfJIN1OB7Sdmq+K9YzQaV/eVli45yoAQTkh9/' + // 'tIz9OBGQFK9jaJv/TqUoRXYdNuLFCKDT/u9fmK3QZ8jS+jPfEhfX31ep6BvS2IImhYp+J0TDrsccG8v' + // 'nuirUdnvFIGCVYE09U74wMuy8YrxounUTL3z8gZ2S8ES2qrxlB6XmilOqETuGZeqBkL7xsaW00/itUA' + // 'VWRNyMoC/hNY7Z85AcbjiBUvxIqUdttBZOfnYYEVq7IdfKAB7/HaEqWnTXET41W2Fn6YnGcmxqoORPa' + // 'kFPluBE6k4tknj5m9dAgdHOlR2TdDNKGz2TfOWgrrba6c1CBopRgAFXhdoBFHm243hvQkv2poNZka9P' + // 'MlU7Hhl9dZ6LPD46bl+96rGZJodMaflW/32xiUH+oD72XNRsq9UGchkorEy+X+mgErsA1B0OfVti83K' + // 'OCEWO3ekqc4hRBwSfN2RMbQ9RwC1jOVzsIA22iQsAdo2eymxgQbqjSzR434MCaAfSgM/nohaUDTjt1f' + // 'k1u7yKV12bREw9Oo78t0lqFMv+xxIg3fR1oUsQ3tWYKb/yG6EUSeX+ngiUyZq1+BRplzwWkGrphQgpb' + // 'qIcNEoMbv8eS+GhITL+YpC1nZgZu/JCon5Yy89'; // HD조선해양 PoC 25_1031 ST_Key_P = 'ISD5vgWXTGX0tJw+7U/HkglGMoHrmlmdZwcGzmrVJ4BKdt4mJgTaJjBHBiGwwcaEOXFvWJOP5NAmC/GDK' + '5jE0MJ+sQj8d5xIfWo23Bw+SikBlAgDD1gjEbuIzZOjxFx1XnFtPAMem6LLNWqDBQMo41yG8UMV7HHTHV' + '117aGIRnuYZrYyHBWV1nURp8CEOQupQY14fK7pLrMftAZ8wFbnkUoV3a15Q7q29/iXNrCnxmK4bq19hkP' + 'aaWncwb9u+9DtL8Bn+fnzVqjxWfJIN1OB7Sdmq+K9YzQaV/eVli45yoAQTkh9/tIz9OBGQFK9jaJv/TqU' + 'oRXYdNuLFCKDT/u9fmK3QZ8jS+jPfEhfX31ep6BvS2IImhYp+J0TDrsccG8vnuirUdnvFIGCVYE09U74w' + 'Muy8YrxounUTL3z8gZ2S8ES2qrxlB6XmilOqETuGZeqBkL7xsaW00/itUAVWRNyMoC/hNY7Z85AcbjiBU' + 'vxIqUdttBZOfnYYEVq7IdfKAB7/HaEqWnTXET41W2Fn6YnGcmxqoORPakFPluBE6k4tknj5m9dAgdHOlR' + '2TdDNKGz2TfOWgrrba6c1CBopRgAFXhdoBFHm243hvQkv2poNZka9PMlU7Hhl9dZ6LPD46bl+96rGZJod' + 'MaflW/32xiUH+oD72XNRsq9UGchkorEy+X+mgErsA1B0OfVti83KOCEWO3ekqc4hRBwSfN2RMbQ9RwC1j' + 'OVzsIA22iQsAdo2eymxgQbqjSzR434MCaAfSgM/nohaUDTjt1fk1u7yKV12bREw9Oo78t0lqFMv+xxIg3' + 'fR1oUsQ3tWYKb/yG6EUSeX+ngiUyZq1+BRplzwWkGrphQgpbqIcNEoMbv8eS+GhITL+YpC1nZgZu/JCon5Yy89'; type TFn_getEPapyrusImage = function(sOutPath: PAnsiChar; nSize: Integer; ullProduct: ULONGLONG): Integer; cdecl; TFn_getLabGuardImage = function(nModuleType, nPartner, nCustomer: Integer; ullSeq: ULONGLONG; sOutPath: PAnsiChar; nSize, nType: Integer): Integer; cdecl; TFn_labGuardPS = function(sKeyPath, sWritePath: PAnsiChar; nSize, nType, nUser: Integer; sDate, sSeq: PAnsiChar): Integer; function getEPapyrusImage(sOutPath: AnsiString; nSize: Integer; ullProduct: ULONGLONG): Integer; function getLabGuardImage(nModuleType, nPartner, nCustomer: Integer; ullSeq: ULONGLONG; sOutPath: AnsiString; nSize, nType: Integer): Integer; function labGuardPS(sKeyPath, sWritePath: AnsiString; nSize, nType, nUser: Integer; sDate: AnsiString; var sSeq: AnsiString): Integer; implementation uses Tocsg.Path; var _hST: THandle = 0; Fn_getEPapyrusImage: TFn_getEPapyrusImage = nil; Fn_getLabGuardImage: TFn_getLabGuardImage = nil; Fn_labGuardPS: TFn_labGuardPS = nil; function InitProcedure: Boolean; var sDllPath: String; begin begin if _hST = 0 then begin sDllPath := GetRunExePathDir + DLL_ST; if not FileExists(sDllPath) then begin sDllPath := GetRunExePathDir + 'conf\' + DLL_ST; if not FileExists(sDllPath) then exit; end; _hST := LoadLibrary(PChar(sDllPath)); if _hST <> 0 then begin @Fn_getEPapyrusImage := GetProcAddress(_hST, 'getEPapyrusImage'); @Fn_getLabGuardImage := GetProcAddress(_hST, 'getLabGuardImage'); @Fn_labGuardPS := GetProcAddress(_hST, 'labGuardPS'); end; end; Result := _hST <> 0; end; end; function getEPapyrusImage(sOutPath: AnsiString; nSize: Integer; ullProduct: ULONGLONG): Integer; begin Result := -1; if InitProcedure and Assigned(Fn_getEPapyrusImage) then Result := Fn_getEPapyrusImage(PAnsiChar(sOutPath), nSize, ullProduct); end; function getLabGuardImage(nModuleType, nPartner, nCustomer: Integer; ullSeq: ULONGLONG; sOutPath: AnsiString; nSize, nType: Integer): Integer; begin Result := -1; if InitProcedure and Assigned(Fn_getLabGuardImage) then Result := Fn_getLabGuardImage(nModuleType, nPartner, nCustomer, ullSeq, PAnsiChar(sOutPath), nSize, nType); end; { Function int labGuardPS(const char* keyPath, const char* writePath, int size, int type, int user, const char* date, char* data); Parameter 1) const char* keyPath - 압축 파일 내에 존재하는 라이센스 키 파일에 대한 경로이며, labcurity.txt 파일을 위치시키신 경로를 입력해주시면 됩니다. ("/your/path/keyName.txt") 2) const char* writePath - 생성될 단위 워터마크 이미지가 저장될 경로입니다. ("/your/path/output.png") 3) int size - 생성될 단위 워터마크 이미지의 사이즈를 지정하는 Parameter 이며, 2 또는 4를 입력하실 수 있습니다. LAB Guard-S는 2, LAB Guard-P는 4입니다. - 해당 Parameter 값에는 2를 입력해주시면 됩니다. 4) int type -> Watermark Shape (0 ~ 3) 0 -> gray base dot data 1 -> gray base data 2 -> blue base dot data 3 -> blue base data - 고객사의 니즈에 따라 다양한 워터마크 Shape을 사용하게 됩니다. - 권장 옵션은 3 -> blue base data 입니다. - 3번 값 기준 권장 투명도는 MFC 옵션 값 기준( 0-투명 ~ 255-불투명) 38 입니다. - 해당 parameter의 옵션에 따라 권장드리는 투명도가 다를 수 있습니다. 5) int user - 현재 제공드리는 SDK는 테스트 버전이기 때문에 1~100까지 입력할 수 있습니다. - POC 또는 실 계약시 계약 인원에 따라 늘어날 수 있습니다. 6) const char* date - 워터마크에 담을 시간 정보 입니다. - 분 단위로 입력이 가능하며, 워터마크를 생성하는 시점에 대한 시간 정보를 입력하시면 됩니다. - (format -> yyyy/MM/dd HH:mm) (2023/01/01 00:00 ~ ) 7) char* data - LAB Guard 검출 모듈에서 보여지는 워터마크 일련번호를 생성해서 포인터에 저장합니다. - user와 date 값 조합으로 생성되며, 보통 해당 워터마크 일련번호를 화면 워터마크 생성시 남긴 로그 또는 출력물 워터마크 로그에 연동하여 구현하게 됩니다. - 크기 할당 필요. ex) char data[100] Return 0 -> Success to Save 1 -> Unavailable KeyFile 2 -> Expired 3 -> No permission 5 -> Failed to Save 6 -> Product out of range } function labGuardPS(sKeyPath, sWritePath: AnsiString; nSize, nType, nUser: Integer; sDate: AnsiString; var sSeq: AnsiString): Integer; var arrData: array [0..99] of AnsiChar; begin Result := -1; if InitProcedure and Assigned(Fn_labGuardPS) then begin sSeq := ''; ZeroMemory(@arrData, Length(arrData)); // FormatDateTime('yyyy/mm/dd hh:nn', Now) 이렇게 해도 2024-05-31... 이렇게 반환되서 강제로 바꿔줌 24_0531 10:45:14 kku sDate := StringReplace(sDate, '-', '/', [rfReplaceAll]); Result := Fn_labGuardPS(PAnsiChar(sKeyPath), PAnsiChar(sWritePath), nSize, nType, nUser, PAnsiChar(sDate), arrData); if Result = 0 then sSeq := AnsiString(arrData); end; end; end.