分享一次C#调用Delphi编写Dll程序
1.前言:
最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C#通过调用Delphi编写好的Dll通过C#中的DllImport进行数据的加解密,其实原本是很简单的一个过程,在中间遇到了一些坑,希望能够分享这次经验,能够避免更多的人踩到这个坑;
2.后续
C#和delphi平台对接的接口
Delphi
有两个方法:
Estr加密,参数1:加密参数,参数2:秘钥
DeStr解密:参数1:解密参数,参数2:秘钥
C#
通过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,然后通过这个一搜索,搜索到了
文章:https://q.cnblogs.com/q/38510
解决方案是用StringBuilder 替换string参数,执行还是报错,从这个结局方案中得到了一点头绪,后续继续找delphi 中Pchar的相关资料,后续通过不断的修改调试,发现在C#中和delphi 中PChar想中相对应的数据类型是IntPtr 然后修改成以下就可以成功了
总结:
以后这种接口对接的问题能够先更多熟悉双方语言基础的一些语法,方便在对接过程中更有效的沟通;
疑问:
为什么在vs2019中调用成功而在Vs2015中却出现了系统级别的日志;
分享一次C#调用Delphi编写Dll程序的更多相关文章
- delphi编写dll心得, 谢谢原作者的分享。转
delphi编写dll心得 1.每个函数体(包括exports和非exports函数)后面加 'stdcall;', 以编写出通用的dll2.exports函数后面必须加'export;'(放在'st ...
- nodejs调用delphi编写的dll
公司的业务需要,nodejs要读取文件版本号. 同事要求我用delphi编写dll,以供nodejs调用,结果通过json返回. delphi代码如下: function GetFileInfo(AP ...
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- 浅谈C++调用C#的DLL程序方法
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服. ...
- [JNA系列]Java调用Delphi编写的Dll之JNA使用
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
- C# 调用delphi编写的dll
技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...
- Qt调用Delphi编写的COM组件
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路 起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码 ICom1 = interfa ...
- Delphi 编写DLL动态链接库文件的知识
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
- Delphi 编写DLL动态链接库文件的知识和样例(有详细步骤,很清楚)
一.DLL动态链接库文件的知识简介: Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝.动态链接库就是在这种情况下出现的.动态链接库不用重复编译或链接,一旦装入内存,Dlls函数可 ...
随机推荐
- asp.net 获取日期
//获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToString(); // 20 ...
- F. Moving On
http://codeforces.com/gym/102222/problem/F fory #include<bits/stdc++.h> using namespace std; t ...
- PLC常见四大故障及其处理方法
众所周知,PLC即可编程控制器,是一种专门为在工业环境下应用而设计的数字运算操作的电子装置. 但PLC在运行中总是会出现一些故障问题,下面就为大家介绍一下PLC常见四大故障及其处理方法 PLC常见四大 ...
- HTTP请求方法及常见状态码
GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体. PUT: 从客户端向服务器传送的数据取代指定 ...
- 2015-09-15-git配置
https://help.github.com/articles/set-up-git/ git上传是忽略一些文件 在每个git的项目中有一个.gitignore文件,将忽略的文件或文件夹输入即可. ...
- 吴裕雄--天生自然Android开发学习:下载安装android stuio集成开发工具
下载链接: https://developer.android.google.cn/index.html
- JavaScript学习总结(五)原型和原型链详解
转自:http://segmentfault.com/a/1190000000662547 私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量 ...
- 转-Zeus资源调度系统介绍
摘要: 本文主要概述阿里巴巴Zeus资源调度系统的背景和实现思路. 本文主线:问题.解决方案.依赖基础知识.工程实践.目标.经验分享.立足企业真实问题.常规解决策略,引出依赖的容器技术.实践方案,所有 ...
- 吴裕雄--天生自然python学习笔记:Python3 错误和异常
语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>>while True print('Hello world') File "< ...
- caffe之数据集介绍
数据集:http://bigdata.51cto.com/art/201702/531276.htm 计算机视觉 MNIST: 最通用的健全检查.25x25 的数据集,中心化,B&W 手写数字 ...