記錄一次C 呼叫Delphi編寫Dll程式過程

2022-02-15 05:51:37 字數 2012 閱讀 5213

1.前言:

最近接手了乙個專案需要和delphi語言編寫的乙個系統進行一些介面的對接,資料在傳輸過程中採用des加密方式,因為delphi 平台的加密方式和c#平台的加密方式不互通,所以採用的方式是c#通過呼叫delphi編寫好的dll通過c#中的dllimport進行資料的加解密,其實原本是很簡單的乙個過程,在中間遇到了一些坑,希望能夠分享這次經驗,能夠避免更多的人踩到這個坑;

2.後續

c#和delphi平台對接的介面

delphi

有兩個方法:

estr加密,引數1:加密引數,引數2:秘鑰

destr解密:引數1:解密引數,引數2:秘鑰

通過dllimport引用dll,然後定義好方法和引數,把對應的dll放到程式生成的bin目錄下

最後傳入引數呼叫方法,原以為到這裡就可以結束,接下來就可以寫後面的業務邏輯了,

想法很美好,結果有點天真,程式直接執行到呼叫方法的時候

出現了第乙個錯誤:

關於無法載入dll"":找不到指定的模組(異常來自hresult:0x8007007e)

找到的解決方式是將專案生成裡面的目標平台修改成x86,目的是在64位系統上相容32位的程式,然後也同時將對應的dll放入到了c:\windows\system32,c:\windows\syswow64這兩個目錄下

然後我按照步驟去操作,發現我的專案是**,不存在目標平台可以去設定,考慮到webapi那塊也需要呼叫到這個des加解密,就把**拷貝了過去進行除錯,執行到加密的那段**的時候,直接vs程式先卡主,然後執行除錯狀態直接關閉了,try異常都不丟擲,有點無奈,找了半天c# dllimport

dll 執行錯誤的解決方案,也沒有找到,後續為了方便除錯就寫了乙個winfrom窗體程式,然後我一開始是用得vs2015開發**(因為vs2019執行**會報錯這個報錯的過程忽略掉),在除錯這個winfrom程式的時候,執行程式到對應的**可以執行成功,成功加密和解密對應的資料,然後我用vs2015開啟這個窗體程式,得到執行失敗的結果,這時候更懵了,後面腦子一閃以前在sql報錯的時候在系統日誌中能夠查到對應的記錄,我想這種錯誤應該也能找得到,最後找到那條記錄日誌錯誤內容是:

出現了第二個錯誤:

錯誤應用程式

w3wp.exe,版本

7.0.6001.18000,時間戳

0x47919413,錯誤模組

ntdll.dll,版本

6.0.6001.18000,時間戳

0x4791a7a6,異常**

0xc0000374,錯誤偏移量

0x000b015d, 程序

id 0xcc4,應用程式啟動時間

0x01cd5de08c54b3ac,然後通過這個一搜尋,搜尋到了

文章:

解決方案是用stringbuilder 替換string引數,執行還是報錯,從這個結局方案中得到了一點頭緒,後續繼續找delphi 中pchar的相關資料,後續通過不斷的修改除錯,發現在c#中和delphi 中pchar想中相對應的資料型別是intptr 然後修改成以下就可以成功了

總結:以後這種介面對接的問題能夠先更多熟悉雙方語言基礎的一些語法,方便在對接過程中更有效的溝通;

疑問:

為什麼在vs2019中呼叫成功而在vs2015中卻出現了系統級別的日誌;

C 呼叫delphi編寫的dll

技術實現 如何逐步實現動態庫的載入,型別的匹配,動態鏈結庫函式匯出的定義,參考下面巨集定義即可 define libexport api extern c declspec dllexport 第一步,我先從簡單的呼叫出發,定義了乙個簡單的函式,該函式僅僅實現乙個整數加法求和 libexport a...

使用Delphi呼叫C 編寫的DLL

1 c 編寫的dll 如下 該dll的功能比較簡單,就是實現乙個整數加法 iaddbase 是乙個抽象類,iadd實現了iaddbase的方法,並採用了單例模式 getaddinstance 為dll對外的介面,返回乙個iadd的物件指標 呼叫者使用該例項就可以呼叫add方法 class iaddb...

記錄一次面試

怎麼觀察系統中 記憶體 行為 a.通過 proc zoneinfo 檔案,可以看到 free high low min pages 關係 free high 時候 一般不開啟 kswapd 執行緒 high free low 時,開啟 kswapd 執行緒 low free min時,alloc p...