http://bbs.csdn.net/topics/380045353

用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下:

function Login(URL:PAnsiChar; UserName: PAnsiChar; UserPass: PAnsiChar; LocalLogin: Boolean):PAnsiChar;
var
   tStr:String;
begin

try
            Result := PAnsiChar(GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin));
            tStr := '成功';
        except
            tStr := '调用 Web 服务失败!';
        end;

ShowMessage(tStr);
end;

调用程序在XP下用DELPHI7编写,
采用静态连接:
function Login(URL:PAnsiChar; UserName: PAnsiChar; UserPass: PAnsiChar; LocalLogin: Boolean):PAnsiChar;stdcall;external 'ws.dll';

编译都通过,运行后,提示“调用 Web 服务失败!”,应该是执行WebServices调用失败了。
PAnsiChar(GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin));

但是,在Win2008下用DelphiXE编写调用程序,提示“成功”。

将D7写的调用程序拷贝到WIN2008下执行,调用成功!!!!
Dxe写的调用程序在XP和WIN2008下执行都成功。

我怀疑问题可能出在D7调用DLL时传递的PAnsiChar与DXE不兼容?将函数改成如下过程,避免传入传出参数
procedure Login1();
var
   tStr:String;
begin
        try

GetAuthenticationSoap(True,'http://192.168.13.1/' + WSDL_Authentication,nil).Login('abc','abc',False);
            tStr := '成功';
        except
            tStr := 'ER:调用 Web 服务失败!';
        end;

ShowMessage(tStr);

end;

结果,测试情况和之前一样,
D7写的调用程序,在XP下调用失败,在WIN2008下调用成功。
DXE写的调用程序,在XP,WIN2008下都调用成功。

后来我又用C#写了一个调用程序,结果和DXE一样,在XP,WIN2008下都调用成功。

我滴个神啊! 我该怎么办?

通过procedure Login1();可以看出问题不是处在D7调用DXE写的DLL传参数问题。
应该是下面这句
GetAuthenticationSoap(True,'http://192.168.13.1/' + WSDL_Authentication,nil).Login('abc','abc',False);
执行WebServices函数的语句出错了。

我再想,是不是DXE编写的调用WebServices程序需要什么其他的库支持。

可把DXE写的调用程序和WS.DLL拷贝到XP下,调用好使,说明不缺库。

可D7写的调用程序,为什么在XP下不好使,拷贝到WIN2008下就好使?

自己都说乱了。总结一下,问题现象是:
D7 + WS.DLL 在XP下调用WebServices不成功,在WIN2008下成功
DXE+ WS.DLL 在XP和WIN2008下都成功
C# + WS.DLL 在XP和WIN2008下都成功

我现在就想要 D7+WS.DLL在XP下好使,怎么办?

更多0分享到:
相关知识库: 深度学习 React Native iOS 直播技术
 
 
 

回复次数:11

关注
CoolSlob
日总是我哥
本版等级:

 
  
#1 得分:20回复于: 2011-11-12 15:53:46
dll中的函数没发现stdcall ,是笔误吗?
关注
kim_fu
kim_fu
本版等级:

 
#2 得分:0回复于: 2011-11-12 15:59:51
我写的是函数实现,在定义处有。
关注
kim_fu
kim_fu
本版等级:

 
#4 得分:0回复于: 2011-11-12 23:48:55
咋整的。没人呢? 提的不是地方?
关注
LoveMit
Mit1208
本版等级:

 
#5 得分:40回复于: 2011-11-13 01:40:12
XE下是PAnsiChar
换成Delphi7下应该是Pchar
关注
cqs6616
cqs6616
本版等级:

 
#6 得分:40回复于: 2011-11-13 10:27:55
  Result := PAnsiChar(GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin));
改成
  Result := PAnsiChar(ansistring((GetLoginSoap(True,URL + WSDL_Login,nil).Login(UserName,UserPass,LocalLogin)));
试试
关注
kim_fu
kim_fu
本版等级:

 
#7 得分:0回复于: 2011-11-13 15:39:21
谢谢两位的回复。
我觉得问题不是出在PChar 与 PAnsiChar上。

看我后来写的那个过程Login1(),不传入传出参数,调用WebServices还出同样的问题。

最令我气愤的是,一个DLL中的没有任何参数的函数,竟然被不同编译器编译的客户程序调用后,执行结果却不一样。
Delphi7写的调用客户端程序叫D7,
DelphiXE写的调用客户端程序叫DXE,
C#写的调用客户端程序叫C#,
DLL文件叫DLL。

测试效果如下:
D7  + DLL 在XP下调用函数成功,但是函数执行WebServices调用却失败,在WIN2008下一切正常
DXE + DLL 在XP,WIN2008下都正常
C#  + DLL 在XP,WIN2008下都正常

奇了怪了。

关注
kim_fu
kim_fu
本版等级:

 
#8 得分:0回复于: 2011-11-16 10:20:58
人气不旺盛啊。
关注
foxyy8888
OO_is_just_P
本版等级:

 
#9 得分:0回复于: 2011-11-16 10:29:24
UnicodeString
WideString
AnsiString
String
PChar
PAnsiChar
PWideChar
PUnicodeChar
?
关注
kim_fu
kim_fu
本版等级:

 
#10 得分:0回复于: 2011-12-02 20:21:40
搞定,问题太简单了。失误啊。

原因是DLL中没有进行COM的初始化

initialization
    Coinitialize(nil);//初始化COM
finalization
    CoUninitialize;//释放COM

关注
yangxingzou
zoyation
本版等级:

 
#11 得分:0回复于: 2012-11-24 01:23:06
加载什么地方

Delphi7调用DelphiXE编写的DLL问题的更多相关文章

  1. C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)

        C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...

  2. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...

  3. 使用clr 调用C#编写的dll中的方法的全解释

    使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...

  4. 通过C#去调用C++编写的DLL

    这个问题缠了我2个小时才弄出来,其实很简单.当对方提供一个dll给你使用时,你需要去了解这个dll 是由什么语言写的,怎么编译的,看它的编译类型.这样即使在没有头绪时,你可以先尝使用一些比较热门的编译 ...

  5. C++项目中采用CLR的方式调用C#编写的dll

    1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...

  6. C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C# ...

  7. Delphi 调用C# 编写的DLL方法

    近来,因工作需要,必须解决Delphi写的主程序调用C#写的dll的问题.在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:    编写C#dll的方法都一样,首先在vs2005中创建一个“ ...

  8. C# 调用delphi编写的dll

    技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...

  9. PB调用C#编写的DLL

    C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了 ...

随机推荐

  1. 通过修改Delphi 的 RTL,加快Delphi开发的应用程序速度和稳定性

    RT 具体见PDF 看了不后悔,只给高手准备的. 神呐,偶看看是虾米东东

  2. eclipse中tomcat调试正确关联源码

    1.build path中jar包关联本地源码 2.tomcat中添加source关联工程lib下的jar包 以上两步即可. 可解决tomcat直接关联本地源码debug时无法计算表达式的情况. 错误 ...

  3. [规则原则定理]规则原则定理章3Java命名规范

    JAVA命名规范 驼峰法则: 将所有字母都小写(包括缩写),然后将单词的第一个字母大写. 每个单词的第一个字母都大写,来得到大驼峰式命名. 除了第一个单词,每个单词的第一个字母都大写,来得到(小)驼峰 ...

  4. 拼图类APP原型模板分享——简拼

    简拼是一款记录美好.抒写情怀的拼图APP,模板设计风格简约文艺,种类齐全. 此原型模板所用到的组件有标签组.水平分隔线.圆形工具.交互动作有结合标签组实现页面跳转,选择组件触发按钮状态变化等. 此原型 ...

  5. 【Java】Maven Tomcat插件使用

    本例是用的是tomcat7-maven-plugin 插件 依赖 tomcat7-maven-plugin 插件的pom.xml依赖为 <dependency> <groupId&g ...

  6. MySQL Server参数优化 - innodb_file_per_table(独立表空间)

    1 简介    Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.    共享表空间以及独立表空间都是针对数据的存储方式而言的.    ...

  7. centos7 hbase 搭建笔记

    1.require:java环境,本地可用的hadoop 2.拷贝hbase文件(hive-1.2.6) 3.设置环境变量 export HBASE_HOME=/data/spark/bin/hbas ...

  8. 数学小知识点整理(TBC)

    文章目录 前言 素数与同余 线性筛部分 素数 线性递推逆元 指数循环节降幂 当求逆元时模数与求逆元的数有可能不互质时的处理方法 一个神奇的结论 拓展欧拉定理 杂乱的一些性质/技巧 二进制枚举子集 异或 ...

  9. 2018.11.18 bzoj2194: 快速傅立叶之二(fft)

    传送门 模板题. 将bbb序列反过来然后上fftfftfft搞定. 代码: #include<bits/stdc++.h> #define ri register int using na ...

  10. java的Scanner获取输入内容

    //导入 scanner的包 import java.util.Scanner; Scanner scanner = new Scanner(System.in); System.out.printl ...