# 32비트 PowerShell에서 AllthatModule.dll iCmd=2 영수증출력 테스트 # 실행: C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File test_print_dll.ps1 Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class AllThatPay { private const string DLL = @"C:\Program Files (x86)\AllthatpayClient\AllthatModule.dll"; [DllImport(DLL, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int AllThatPayOpenModule(string gwIp, string gwPort, string atpIp, string atpPort, string bizNo, string ediType, int optFlag); [DllImport(DLL, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int AllThatPayCloseModule(); [DllImport(DLL, CallingConvention = CallingConvention.StdCall)] public static extern int AllThatPayCatReqMC(int iCmd, byte[] pInBuf, int iInLength); [DllImport(DLL, CallingConvention = CallingConvention.StdCall)] public static extern int AllThatPayRetCon(); [DllImport(DLL, CallingConvention = CallingConvention.StdCall)] public static extern IntPtr AllThatPayRetData(int iPosition); } "@ # --- GW 포트 자동 탐지 --- $gwPort = $null $proc = Get-Process -Name "AllthatpayClient" -ErrorAction SilentlyContinue | Select-Object -First 1 if ($proc) { $netstat = netstat -ano 2>$null foreach ($line in $netstat) { if ($line -match "LISTENING" -and $line -match "\s$($proc.Id)\s*$") { if ($line -match ":(\d+)\s") { $port = [int]$Matches[1] if ($port -ne 8080 -and $port -ne 7779) { $gwPort = $port.ToString() break } } } } } if (-not $gwPort) { Write-Host "[ERROR] GW port not found" -ForegroundColor Red exit 1 } Write-Host "[INFO] GW Port: $gwPort" -ForegroundColor Cyan # --- DLL 연결 --- $r = [AllThatPay]::AllThatPayOpenModule("127.0.0.1", $gwPort, "", "", "8134500294", "P01", 0) Write-Host "[INFO] OpenModule: $r (1=OK)" -ForegroundColor $(if ($r -eq 1) {"Green"} else {"Red"}) if ($r -ne 1) { Write-Host "[ERROR] OpenModule failed" -ForegroundColor Red exit 1 } # --- 영수증 텍스트 (EUC-KR) --- $eucKr = [System.Text.Encoding]::GetEncoding("euc-kr") $text = "================================================`n" $text += " [ 청 춘 약 국 ]`n" $text += " 경기 양주시 양주역로 7-3 1층`n" $text += " TEL: 033-481-7390`n" $text += "================================================`n" $text += "`n" $text += " ** DLL iCmd=2 인쇄 테스트 **`n" $text += " 시간: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')`n" $text += "`n" $text += "------------------------------------------------`n" $text += " ★ 마일리지 적립 ★`n" $text += " QR 스캔하고 100P 받으세요!`n" $text += " (유효기간: 30일)`n" $text += "------------------------------------------------`n" $text += "`n`n" $textBytes = $eucKr.GetBytes($text) # --- QR 코드 추가: FS×4 + ATQR_URL (명세서 CMD 2 규격) --- $qrUrl = "https://shc.pharmq.kr/claim?t=test_dll_print" [byte]$fs = 0x1C $qrTag = $eucKr.GetBytes("ATQR_" + $qrUrl) $buf = New-Object System.Collections.Generic.List[byte] $buf.AddRange($textBytes) $buf.Add($fs); $buf.Add($fs); $buf.Add($fs); $buf.Add($fs) $buf.AddRange($qrTag) $packet = $buf.ToArray() Write-Host "[INFO] iCmd=2 send ($($packet.Length) bytes, text=$($textBytes.Length) + QR=$($qrTag.Length))..." -ForegroundColor Yellow # --- iCmd=2 영수증출력 --- try { $pr = [AllThatPay]::AllThatPayCatReqMC(2, $packet, $packet.Length) Write-Host "[INFO] CatReqMC(2): $pr" -ForegroundColor $(if ($pr -ne 0) {"Green"} else {"Red"}) } catch { Write-Host "[ERROR] CatReqMC exception: $_" -ForegroundColor Red } # --- 정리 --- try { [AllThatPay]::AllThatPayCloseModule() | Out-Null } catch {} Write-Host "[DONE]" -ForegroundColor Cyan