DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 4
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/11/1 17:21:44
标题:
关于Delphi写的DLL在SQL Server里注册、调用问题 浏览:1945
加入我的收藏
楼主: Procedure _Send;StdCall;
Var UDP:TIDUDPClient;
Begin
  UDP:=TIDUDPClient.Create;
  UDP.Host:='200.200.200.255';
  UDP.Port:=8000;
  UDP.Active:=True;
  UDP.Send('SQL Server UDP Test ');
  UDP.Free;
End;

Exports _Send;
----------这样OK,但若我加个参数,就挂了如下

Procedure _Send(S:String='');StdCall;
Var UDP:TIDUDPClient;
Begin
  UDP:=TIDUDPClient.Create;
  UDP.Host:='200.200.200.255';
  UDP.Port:=8000;
  UDP.Active:=True;
  UDP.Send('SQL Server UDP Test '+S);
  UDP.Free;
End;

Exports _Send;

没有参数的,调用OK,发的UDP能接收到

加上参数后,在SQL SERVER里执行就提示:
Msg 0, Level 11, State 0, Line 0
当前命令发生了严重错误。应放弃任何可能产生的结果。

晕倒 。。。
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 grjs_2004 (grjsITname) ★☆☆☆☆ -
盒子活跃会员
2011/11/1 17:30:21
1楼: UDP.Send()的发送内容是一个整体,如果需要传入参数,
建议另外设置一个变量,比如这样
var
  S : string;

Procedure _Send;StdCall;
Var 
  UDP:TIDUDPClient;  
Begin
  UDP:=TIDUDPClient.Create;
  UDP.Host:='200.200.200.255';
  UDP.Port:=8000;
  UDP.Active:=True;
  S := 'SQL Server UDP Test '+S;
  UDP.Send(S);
  UDP.Free;
End;
----------------------------------------------
Everyone will to do best!
作者:
男 supermay (supermay) ★☆☆☆☆ -
盒子活跃会员
2011/11/1 23:11:05
2楼: 为什么不用VS2010写,用C#写也是很简单的
----------------------------------------------
链接:https://pan.baidu.com/s/12jzmECYKhGCsHBxz8tmB6w 提取码:pelr --来自百度网盘超级会员V9的分享
作者:
男 xjia (xjia) ★☆☆☆☆ -
盒子活跃会员
2011/11/2 8:38:55
3楼: 看来你用的是2010以前的DELPHI,DLL导出函数中的参数不能用STRING,改成PCHAR应该就没问题了
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2011/11/2 9:01:52
4楼: string是delphi的特有类型,而且,你要用string的话,需要加上内存管理单元。

另外,pchar也不要随便用,最好指定编码,也就是pansichar或pwidechar
----------------------------------------------
--
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/11/2 9:06:40
5楼: uses
  SysUtils,
  Classes,
  IdBaseComponent,
  IdComponent,
  IdUDPBase,
  IdUDPClient;

{$R *.res}

Procedure _Send(SY:PWideChar);StdCall;
Var UDP:TIDUDPClient;
    EC:TEncoding;
Begin
  EC:=TEnCoding.Unicode;
  UDP:=TIDUDPClient.Create;
  UDP.Host:='200.200.255.255';
  UDP.Port:=8000;
  UDP.Active:=True;
  UDP.Send('SQL Server UDP Test '+StrPas(SY),EC);
  UDP.Free;
End;

Exports _Send;

----------
Delphi XE
客户端收到的广播内容均为:"S",晕倒。。。
若把TEnCoding改为ASCII/UTF7/UTF8/DEFAULT,其结果均为"????",参数传入长短均如此。汗
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/11/2 10:01:44
6楼: 规律:常量部分OK,正确。。但参数部分就会显示为"????" or "/ ? / ?" 之类的
看起来是解码问题,但试过TEnCoding.Default/ASCII/UTF7/UTF8/UNICODE。。。均没有正确结果
Send声明:Send(Const AData:String;[AEnCoding:TEnCoding=nil])
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/11/2 11:34:38
7楼: 传PChar PWideChar PANSIChar均乱码。。。
传Integer,得到的值也是像随机数一样,八九位的数字。。。。

不知道做了啥鸟转换。。。
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/11/2 12:13:57
8楼: 在DLL里跟踪了值,
Var S:String;

S:='SQL Server UDP Test '+StrPas(SY);
这个S的值SY部分本身就是乱码了。。。

晕倒
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 wzwcn (wzw) ★☆☆☆☆ -
普通会员
2011/11/2 12:20:15
8楼: 你要确认传过来的是什么编码,你把传过来的数据转成十六进制再看看,比如传“中”字,GBK码为D0D6,Unicode为4E2D,UTF8为ADB8E4等等(我估计它是Unicode或UTF8),知道它的编码方式后就简单了,如果你是用D2009以前的delphi,把它转成ansic就行了,如果是D2009后转成UnitCode,再和你的发数内容拼接成串发送就行了
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/11/2 14:18:05
9楼: Delphi 是XE,SQL Server 2008
SQL SERVER声明Varchar or NVarchar,与参数为PWideChar、PANSIChar均试过,基TEnCoding的值ASCII、UTF7、UTF8、UNICODE每种组合均试过<若无遗漏的话>

而且,我传的varchar or NVarchar 的值均是英文字符,如 aaaaaaa 而已

快晕倒了。。
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS