台灣最大程式設計社群網站
線上人數
1236
 
會員總數:246046
討論主題:189631
歡迎您免費加入會員
討論區列表 >> VB6 >> 電子發票 QRDll.Dll 取得 AES 驗算碼
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
電子發票 QRDll.Dll 取得 AES 驗算碼
價值 : 250 QP  點閱數:666 回應數:2
樓主

Jack Oue
門外漢
0 1
44 2
發送站內信

開發電子發票,遇到了一個大問題

電子發票整合服務平台->營業人常用下載->電子發票QRCode加解密工具
https://www.einvoice.nat.gov.tw/home/DownLoad?fileName=1479449078379_0.zip

利用 QRDll.Dll 中的 QRCodeINV 取得 AES 加密資料,用於 QRCode 列印上
宣告如下
Private Declare Function QRCodeINV Lib "QRDLL.dll" (ByRef S11 As String, ByRef S12 As String, ByRef S13 As String, ByRef S14 As String, ByVal n1 As Double, ByVal n2 As Double, ByVal N3 As Double, ByRef S21 As String, ByRef S22 As String, ByRef S23 As String, ByRef S24 As String, ByRef L As String, ByVal M As Byte, ByRef n As Integer)


Dim tKey(0 To 77) As Byte, tNum As Integer
Dim tT As String
tT = "05D4A324ABAF4A570E64E572221E438B"

Call QRCodeINV("AA12345678", "1001231", "150000", "1234", CDbl(1000000), CDbl(100), CDbl(100), "12345678", "87654321", "12344321", "88888888", tT, tKey, tNum)

結果死當,沒任何回應 ; Google VFP/Delphi 都能呼叫,被 VB6 搞的快瘋了
不知是否有人能分享經驗

搜尋相關Tags的文章: [ 電子發票 ] , [ QRDLL.DLL ] , [ QRCodeINV ] ,
本篇文章發表於2019-11-11 17:58
1樓
最有價值解答

WilliamHsieh
檢舉此回應
Jack Oue : 你好!

這個問題還沒找到答案麼? 你的範例給了我啟發, 我正是需要用VB6寫這一段. 雖然知道照著寫會槓龜, 但至少是一個開頭, 單純在VB6左改右改左試右試卻沒有半點突破. 只好找出原始的C範例testAES.c, 安裝並不熟悉的VC6來做比對. 範例的程式可能是按前一版的QRDLL.dll規格寫成的, 修正了參數個數才正確執行.

然後再另寫VB6呼叫VC6寫的.dll(自己編寫), 也同樣寫VC6來終呼叫, 互相比對. 終於在將3支程式(VC6 Called, VC6 calls, VB6 Calls)多次修改後完成想要的測試, 也才大致掌握了回頭修改VB6這支(呼叫QRDLL.dll)程式的方向.

首先確認的是1.最後兩個回傳參數要用ByRef外, 其餘一概要用ByVal(如果用ByRef其實也OK, 但"AA12345678", "1001231",...常數都必須換成變數名, 而且As String都要全部改成As Byte, 步驟會囉嗦許多), 使用ByVal參數欄可填上變數也可填上常數, 重點是省去將String轉成Byte的處理. 2.ByRef M as Byte才能正確取回tKey值, 寫在Call裡的KEY, 必須改成tKey(0)才能做正確(目前試出這是唯一能做正確的寫法).

以為如上兩個調整就可過關, 結果還是失敗, 想到的就是自寫一支呼叫QRDLL.dll的VC6 .dll讓VB6來呼叫, 結果問題一模一樣, 這才發現3.Private Declare Function QRCodeINV... 中的Function應該改為Sub(不然傳出去時多了額外的第1個參數, 所有參數都對應錯位置).

前述3個修改就能讓程式正確運轉, 如果沒順利完成可再詢問我!

附記: (*仍然很重要!)
a. VB6的String給值, 是不會放上Null來宣告結尾, 這樣送到QRDLL.dll就要當掉回不來了. 所以記得String的最末要放CHR$(0), 例S11 = "AA12345678" + CHR$(0)
為防萬一, iKey我也先給值: For I = 0 To 78: tKey(I) = 32: Next I: tKey(78)=0
b. 各個文字參數在QRDLL.dll中定義的長度是多2個Bytes的, 除了應多加的Null外仍多留1 Byte: 在VC6例如Char S11[11]; Char tT[33]; Char tKey[78];
所以在VB6要寫成Dim S11 As String * 12, tT As String * 34, tKey(78) As Byte
(Byte Array的index由0編起)
本篇文章回覆於2020-01-10 14:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Jack Oue
檢舉此回應
非常感謝您的回答,會再試試看!!!
本篇文章回覆於2020-01-10 15:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.