Delphi XE3写DLL,用Delphi7调用,报错!
http://bbs.csdn.net/topics/390870532
|
用delphi xe3写的DLL,delphi7调用,参数都是PAnsiChar,DLL里的函数接收delphi7传的入参,没有问题,为什么返回参数会是乱码???
Delphi XE3的DLL代码: Delphi/Pascal code
Delphi7 调用代码 Delphi/Pascal code
为什么返回参数会是乱码?定义的数据类型不对吗? 更多0分享到:
|
||||
|
#1 得分:0回复于: 2014-08-26 09:09:42
我也写过一个这样的。
在XE2写到DLL在Delphi2010调用,一直出错。最后没办法只能装个2010编译我写到DLL,就可以了。 Delphi在处理版本之间的转换很不到位 |
|
#2 得分:2回复于: 2014-08-26 09:15:21
function Test(Instr1,Instr2:PAnsiChar):PAnsiChar;stdcall;可以改成这样
str1,str2:string; |
|
|
#3 得分:2回复于: 2014-08-26 09:16:24
str1,str2:string;
换成 str1,str2:AnsiString试试 或者 |
|
|
#4 得分:2回复于: 2014-08-26 09:27:29
AnsiString 的问题. string 不可以直接转成 PAnsiChar 的
|
|
|
#5 得分:0回复于: 2014-08-26 10:17:28
用D7重新编译DLL嘛
|
|
|
#6 得分:1回复于: 2014-08-26 12:18:19
接口函数两边的申明不一致,retMsg上面是变参,下面是形参
应该是D7的申明里漏了var |
|
|
#7 得分:0回复于: 2014-08-27 09:27:56
动态库修改
str1,str2:AnsiString; 或者 retMsg:=PAnsiChar( AnsiString( str1+'-'+str2) ); 可以,完全正确。 如果想要DelphiXE3写的DLL,用C++也可以调用,那么字符串的参数类型应该怎么定义? |
|
|
#8 得分:0回复于: 2014-08-27 20:36:46
Delphi版的人越来越少了吗?????????
|
|
|
#9 得分:20回复于: 2014-08-28 11:29:32
1 调用时type TTest=function(Instr1,Instr2:PChar; retMsg:PChar):Integer;stdcall;缺少Var标识。
2 D7的Pchar是PAnsiChar XE后是PWidechar。 不多说了 Library TestDll; Uses Function Test(Instr1, Instr2: PAnsiChar; Var retMsg: PAnsiChar): Integer; Stdcall; Exports End. Type Type |
|
|
#10 得分:0回复于: 2014-08-28 11:39:00
AnsiChar,在xe2和D7占1个字节
Char,在xe2中占2个字节,在D7占1个字节 |
|
|
#11 得分:0回复于: 2014-08-28 20:58:46
同意7楼的,,,DLL里面出来的数据有问题。
|
|
|
#12 得分:0回复于: 2014-08-29 20:44:54
Delphi 好像是从 2010 开始,char,AnsiChar, widechar, string, ansistring, widestring 占用的字节不一样了~
一定要注意,如果想高版本的程序移到低版本,就要注意字符定义必需一一对应了. 就如你dll时定义了PAnsiChar, 到了调用时,也需要 是PAnsiChar而不能用 pchar |
|
|
#13 得分:1回复于: 2014-08-30 22:12:16
引用 7 楼 wzgdyn 的回复:
随便,可以不用改,PAnsiChar就对应C++里的char* |
|
#14 得分:20回复于: 2014-08-30 23:39:48
lz的代码有这么几个问题:
1. 函数的签名不同,导出的是 var retMsg: PAnsiChar; 使用的却是 regMsg:Pansichar;后者无法接收到返回的值。 2. 导出函数使用UnicodeString(xe3string是UnicodeString),却硬生生的把他强制转换为PAnsiChar; 3. 函数返回的retMsg是由临时的函数内变量,函数结束,该变量消失。你获得的将是一个非法内存地址。 4. 对string的编译器自动引用计数管理认识不清,string的引用计数不能跨dll的,他是delphi特有的东西。 解决方法 调用的函数负责释放内存。因此dll还需提供一个释放内存的导出函数(将Freemem封装成导出函数); |
|
|
#15 得分:2回复于: 2014-09-02 10:55:03
retMsg:=PAnsiChar(str1+'-'+str2);
str1+''+str2的内容是保存在临时变量中的,这个临时变量是局部变量,离开函数的时候就被回收了. 你转成PAnsiChar的地址指向的是无效的地址,之所以有时候会是正常的是因为内存管理器没有重用这块内存的话看上去像是对的. |
|
|
#16 得分:0回复于: 2014-09-13 21:30:25
string换成widestring试试看
|
|
|
#17 得分:0回复于: 2014-09-18 13:24:42
PAnsiChar, PChar,string 都改成 WideString 试试看。
|
Delphi XE3写DLL,用Delphi7调用,报错!的更多相关文章
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...
- Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...
- this.$Message.success('提示信息') 少写了一个c 导致报错
this.$Message.success('提示信息') 少写了一个c 导致报错 而且 $Message 输出还没显示,导致我以为是没有 $Message 对象了,其实全局对象直接调用即可
- 解决alaert.builder二次调用报错的bug
报错的代码是: The specified child already has a parent. You must call removeView() on the child's parent f ...
- 记录一次在Github写博客时的报错和解决方法
前几天刚刚搭建好了Github博客,打算用作记录Go语言学习笔记.由于在此前我没有使用过markdown语法写过博客,所以跟着文档了解了格式就想试试, 发表第一篇博客.markdown编辑器我用的是T ...
- 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题1---cvNamedWindow调用报错的问题
问题描述: 这个实际上是最后一部的问题,将生成的共享库文件放入到了/usr/local/opencv-arm/lib下,并且设置了LD_LIBRARY_PATH中为/usr/local/opencv- ...
- .Net Core redis 调用报错 '6000 Redis requests per hour' 解决 6000 此调用限制
问题描述 redis 是一种基于内存,性能高效的 NoSQL 数据库,性能高主要就体现在数据交互耗时较短,能够段时快速的对用户的请求做出反应,所以在业务比较复杂或交互量需求大时,必然会超过 6000次 ...
- Django 调用报错 " ImportError: Couldn't import Django. "
系统炸了导致不得已重装 安装 Django后 利用ORM 创建表的时候报错 Traceback (most recent call last): File "manage.py", ...
- python已写内容中可能的报错及解决办法
理论上我发的每个短文,直接复制放到py里面,python xx.py是可以执行的,不过因为版本,编码什么的问题会有报错,详见这里 报错: SyntaxError: Non-ASCII characte ...
随机推荐
- JDK 之 Java Bean 内省机制
JDK 之 Java Bean 内省机制 JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html) JavaBean 是一种特殊的 Jav ...
- Python之路(第三篇):Python基本数据类型字符串(二)
一.基本数据类型1.字符串 str字符串方法介绍(二)a --expandtabs( ) expandtabs( ) 把字符串中的 tab 符号('\t')转为空格参数默认为8,注意字符串原有的空格也 ...
- Java虚拟机的相关笔记
1.垃圾GC回收事件Minor GC(只清除新生代),Full GC(清除新生代和老年代),Major GC(清除新生.老年代和持久代). 2.堆分为新生代.老年代和持久代,持久代一般存放静态文件. ...
- No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal
No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in t ...
- openssl初步使用
centos平台 md5.c #include <stdio.h> #include <string.h> #include <stdlib.h> //#inclu ...
- Linux学习笔记:系统目录结构
Linux系统文件夹代表的含义: /bin - Binaries. /boot - Files required for booting. /dev - Device files. /etc - Et ...
- 【Java】生成图形验证码
本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...
- 【Web】网页清除浮动的方法
网页中,经常用浮动的div来布局,但是会出现父元素因为子元素浮动引起内部高度为0的问题,为了解决这个问题,我们需要清除浮动,下面介绍4中清除浮动的方法. 在CSS中,clear属性用户清除浮动,语法: ...
- navicat下创建和执行存储过程
- GUI的最终选择Tkinter模块练习篇
一.Canvas画布练习 1)简单的绘制图框 from tkinter import * # 构建一个窗口 tk = Tk() # 画布 canvas= Canvas(tk,width=,height ...
