文档章节

在 API 函数中使用 PChar 参数的几种方法

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 208
阅读 7
收藏 0

//以 GetWindowsDirectory 为例:

{ 以静态数组做缓冲区 }
procedure TForm1.Button1Click(Sender: TObject);
var
  buf: array[0..MAX_PATH-1] of Char;
begin
  GetWindowsDirectory(buf, SizeOf(buf));
  ShowMessage(buf); { C:\\WINDOWS }
end;

{ 自己分配内存 }
procedure TForm1.Button2Click(Sender: TObject);
var
  p: PChar;
begin
  p := StrAlloc(MAX_PATH);
  GetWindowsDirectory(p, StrBufSize(p));
  ShowMessage(p); { C:\\WINDOWS }
  StrDispose(p);
end;

{ 直接使用 string; 这和下一种方法都需要再删除尾部空白 }
procedure TForm1.Button3Click(Sender: TObject);
var
  str: string;
  len: Integer;
begin
  SetLength(str, MAX_PATH);
  len := GetWindowsDirectory(PChar(str), ByteLength(str));
  SetLength(str, len);
  ShowMessage(str); { C:\\WINDOWS }
end;

{ 同时, 把 PChar(str) 改为 @str[1] }
procedure TForm1.Button4Click(Sender: TObject);
var
  str: string;
  len: Integer;
begin
  SetLength(str, MAX_PATH);
  len := GetWindowsDirectory(@str[1], ByteLength(str));
  SetLength(str, len);
  ShowMessage(str); { C:\\WINDOWS }
end;

{ 这种方法最好, 先获取结果的长度... }
procedure TForm1.Button5Click(Sender: TObject);
var
  len: Integer;
  str: string;
begin
  len := GetWindowsDirectory(nil, 0);
  SetLength(str, len);
  GetWindowsDirectory(PChar(str), len);
  ShowMessage(str); { C:\\WINDOWS }
end;

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/04/26/1721350.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
用好Delphi中的字符串

用好Delphi中的字符串日期:2005年10月18日 作者: 人气:17184 查看:[大字体 中字体 小字体]一:各种字符串  字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参...

vga
2016/08/09
14
0
HOOK API DLL 注入

一、 序言对大多数的Windows开发者来说,如何在Win32系统中对API函数的调用进行拦截一直是项极富挑战性的课题,因为这将是对 你所掌握的计算机知识较为全面的考验,尤其是一些在如今使用RAD...

长平狐
2012/09/03
3K
0
delphi pchar char byte string转换问题

delphi pchar char byte string转换问题 注:Delphi中的Char,PChar,PByte,Byte,String的相互转换,您是不是也遇到过,为此头疼过吗?你要是明白了他们的原理就会轻松了。 话题064840的标题是...

鹅倌
2017/01/06
0
0
Delphi防止同时出现多个应用程序实例--CreateMutex

 多实例指同时有同一个应用程序的多个副本在运行。同一个应用程序的多个副本可以相互独立地同时运行,是Win32操作系统提供的一个功能。但有时,我们可能希望用户启动应用程序后就不再启动它...

技术小胖子
2017/11/09
0
0
Python天天美味(29) - 调用VC++的动态链接库(DLL)

1. 首先VC++的DLL的导出函数定义成标准C的导出函数: #ifdef LRDLLTEST_EXPORTS #define LRDLLTESTAPI _declspec(dllexport) #else #define LRDLLTESTAPI _declspec(dllimport) #endif exte......

zting科技
2017/01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

协议简史:如何学习网络协议?

大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应。并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背。 考试的时候,果然遇到这个问题,搜索枯肠,只能想...

Java干货分享
21分钟前
2
0
集合练习

package package1;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.List;import java.util.ListIterator;import java.ut......

小橙子的曼曼
24分钟前
1
0
雷军亲自打造的套餐了解下:用多少付多少

12月28日消息,小米科技创始人兼CEO雷军微博表示,小米移动任我行套餐方案,原则上就是明明白白消费,用多少付多少,不用不花钱!上网、电话和短信都是一毛钱,上网0.1元/M,电话0.1元/分钟,...

linux-tao
46分钟前
1
0
在 Ubuntu 上为 CentOS 编译 Rust 程序

现在 CentOS 8 还没出来,最新的是 CentOS 7.6,上面搭载的 glibc 版本是 2.17,都已经是 2012 年那时候的版本了。 现在开发者比较常用的桌面 Linux 系统,比如 Ubuntu / Debian / Mint / A...

helloclia
56分钟前
13
1
Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期

前言:从本篇开始,将进入Multimedia框架,包含MediaPlayer, Camera, Surface, MediaRecord, 接下来几篇都是MediaPlayer相关。同样看下Agenda如下: MediaPlayer的状态图 Idle 状态 End 状态...

天王盖地虎626
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部