QSDK 的支付宝支付的 iOS 移动支付版本已经搞定,目前实测工作正常。 关于开通支付宝支付相关的东西,咱们先不讨论,大家按支付宝支付的要求就可以了。 先说共同的部分,在代码中调用支付宝支付的步骤: 一、引用单元 QSDK 中支付宝相关功能的接口实现单元是 qsdk.alipay.pas,而对应于 Android 和
月度归档: 2016年12月
[教程]如果在 Delphi 中将一个Java传回的父接口转换成支持的子接口类型
好吧,我原本以为可以直接 as 实现,但现实告诉我想多了,所以这块我们需要额外的处理,基本的逻辑步骤是: 引用 Androidapi.JNI.JavaTypes 单元,以便我们引用 TJLang_Class。 使用 TJlang_Class.JavaClass.forName 获取子类的 Java 原生类型信息。 使
[转]AOne:修正Firemonkey 中英文混排折行问题(移动平台)
原文链接:[修正] Firemonkey 中英文混排折行问题(移动平台) – 龟山Aone – 博客园 问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题
[QSDK]使用微信SDK在手机中实现微信支付
QSDK 的微信支付的移动支付版本已经搞定,目前实测工作正常。 关于开通微信支付相关的东西,咱们先不讨论,大家按微信支付的要求就可以了。 先说共同的部分,在代码中调用微信支付的步骤: 一、引用单元 QSDK 中微信相关功能的接口实现单元是 qsdk.wechat.pas,而对应于 Android 和 iOS 版本的具体
[工具] Large Log Viewer 大型日志查看工具
生活中难免有意外,日志也难免有巨大的日志。比如说几百 M 或上 G 的日志,如果利用普通的文本查看器查看,需要极高的内存不说,打开速度还很慢,无法方便的查找问题所在。Large Log Viewer (LLV) 就是解决这一问题的工具。 LLV 可以快速打开超大的日志文件,并且在其中使用正则或普通的搜索方式来进行查找想
[教程]如果在 Delphi 中重载父类重载的接口中的某个非虚函数
好吧,这个问题可能够无聊,反正父类已经实现了,为啥不用父类的一类的问题就不要问了,反正这个事也没啥可争论的,只是告诉大家一种关于接口的写法。 我们都知道 Delphi 中接口对象一般从 TInterfacedObject 继承,但 QueryInterface 函数却不是虚函数,所以想重载是无门的,为此 QPlugin
[杂谈] 调用 Windows API Ping 指定的主机
一段简单的代码,调用 API 来实现 PING 指定的主机。 [C++ Builder 版]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <iphlpapi.h> #include <icmpapi.h> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") // --------------------------------------------------------------------------- int __fastcall Ping(const AnsiString AHost) { HANDLE hIcmp = IcmpCreateFile(); int ARetVal; if (hIcmp != INVALID_HANDLE_VALUE) { try { char AData[32] = "ICMP Data"; DWORD Addr = inet_addr(AHost.c_str()); if (Addr == INADDR_NONE) { hostent *ent = gethostbyname(AHost.c_str()); if (ent && (ent->h_addrtype == AF_INET)) { Addr=*((DWORD *)ent->h_addr_list[0]); } else { ARetVal = GetLastError(); return ARetVal; } } DWORD AReplySize = sizeof(ICMP_ECHO_REPLY)+sizeof(AData); char AReply[sizeof(ICMP_ECHO_REPLY)+sizeof(AData)]; ARetVal = IcmpSendEcho(hIcmp, Addr, &AData, sizeof(AData), NULL, AReply, AReplySize, 1000); if (ARetVal == 0) ARetVal = GetLastError(); else ARetVal = 0; } __finally { IcmpCloseHandle(hIcmp); } } else ARetVal = GetLastError(); return ARetVal; } |
[Delphi 版]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
uses iphlpapi, winsock; const ICMPDLL = 'icmp.dll'; type PIPOptionInformation = ^TIPOptionInformation; TIPOptionInformation = packed record TTL: Byte; TOS: Byte; Flags: Byte; OptionsSize: Byte; OptionsData: PChar; end; ICMP_ECHO_REPLY = packed record Address: DWORD; Status: DWORD; RTT: DWORD; DataSize: Word; Reserved: Word; Data: Pointer; Options: TIPOptionInformation; end; TIcmpEchoReply = ICMP_ECHO_REPLY; PIcmpEchoReply = ^TIcmpEchoReply; function IcmpCreateFile: THandle; stdcall; external ICMPDLL; function IcmpCloseHandle(IcmpHandle: THandle): Boolean; stdcall; external ICMPDLL; function IcmpSendEcho(IcmpHandle: THandle; DestinationAddress: DWORD; RequestData: Pointer; RequestSize: Word; RequestOptions: PIPOptionInformation; ReplyBuffer: Pointer; ReplySize: DWORD; Timeout: DWORD): DWORD; stdcall; external ICMPDLL; // --------------------------------------------------------------------------- function Ping(const AHost: AnsiString): Integer; var hIcmp: THandle; AData: array [0 .. 31] of Byte; AReply: array [0 .. sizeof(ICMP_ECHO_REPLY) + 31] of Byte; Addr: Cardinal; ent: PHostEnt; AReplySize: Integer; begin hIcmp := IcmpCreateFile; if hIcmp <> INVALID_HANDLE_VALUE then begin try Addr := inet_addr(PAnsiChar(AHost)); if Addr = INADDR_NONE then begin ent := gethostbyname(PAnsiChar(AHost)); if Assigned(ent) and (ent.h_addrtype = AF_INET) then Addr := PCardinal(ent.h_addr_list[0])^ else begin Result := GetLastError; Exit; end; end; AReplySize := sizeof(ICMP_ECHO_REPLY) + sizeof(AData); Result := IcmpSendEcho(hIcmp, Addr, @AData[0], sizeof(AData), nil, @AReply[0], AReplySize, 1000); if Result = 0 then Result := GetLastError() else Result := 0; finally IcmpCloseHandle(hIcmp); end; end else Result := GetLastError(); end; |
成功,返回0,失败返回错误代码,参数可以是主机名或IP地址。如果是主机名