【温故Delphi】Win32API之GetTempFileName

所遇问题

  新建的算量工程文件暂时保存到临时文件中,代码中调用了Win32 API——GetTempFileName

  但在一台笔记本上,函数返回了一个空字符串!

  为了查明原因想到了好用的GetLastError——返回错误信息。

  结果错误信息为“拒绝访问”,这让我很快想到了传入文件夹用户权限问题。

  经过检验,果然当前用户没有传入文件夹的写权限。

 1   function GetTempFileA(const APrefix: string; const APath: string): string;
 2   var
 3     sPath: string;
 4     nErrCode: UINT;
 5   begin
 6     SetLength(Result, MAX_PATH);
 7     sPath := Trim(APath);
 8     if sPath = ‘‘ then
 9       sPath := GetCurrentDir;
10
11     SetLastError(ERROR_SUCCESS);
12     if GetTempFileName(PChar(sPath), PChar(APrefix), 0, PChar(Result)) = 0 then
13     begin
14       Result := ‘‘;
15       raise Exception.Create(SysErrorMessage(GetLastError));
16     end
17     else
18       SetLength(Result, StrLen(PChar(Result)));
19   end;

API说明

  

反思

  茁壮的程序代码一定要有好的容错方法,一定要将错误信息发布出去。

  不怕出错,就怕不知道错在哪!

【温故Delphi】Win32API之GetTempFileName

时间: 2024-08-30 03:26:55

【温故Delphi】Win32API之GetTempFileName的相关文章

【温故Delphi】Win32API之CreateMutex

解决问题 如何让一个软件在一台机器上只能运行一个实例呢?这个问题用专业术语就是进程互斥.这个问题可以通过CreateMutex来解决. 进程互斥的核心思想:进程在启动时首先检查是否存在此进程实例,如果没有则创建进程并设置进程实例已存在的标记. CreateMutex用于创建一个互斥体: OpenMutex为现有的一个已命名互斥体对象创建一个新句柄: ReleaseMutex释放由线程拥有的一个互斥体的控制权. 具体实现代码如下: 1 constructor TUniqueAppInstance.

【温故Delphi】GAEA用到Win32 API目录

Delphi是Windows平台下著名的快速应用程序开发工具,它在VCL中封装并使用了大量的Win32 API. GAEA基于VCL开发的工具类产品,在程序中使用了大量的Win32 API,将经常用到或涉及到的API罗列并梳理一下. 系统API 1.事件对像:CreateEvent.setevent.ResetEvent和WaitForSingleObject: 2.互斥体:CreateMutex,OpenMutex和ReleaseMutex 3.时间:GetTickCount,Sleep,Ge

【温故Delphi】双击工程文件打开软件

问题描述 大部分软件都有鼠标双击文件,就能打开所关联的软件并打开所选工程,这是如何做到的呢? 把文件关联到一个程序中,双击文件来启动程序,那么这个文件名称就是这个程序的命令行的一个参数. 所以要想实现双击工程文件打开软件,在程序运行入口必须要处理命令行. 代码说明 1 begin 2 Application.Initialize; 3 CreateMainForm(); 4 //GetCommandLine为Win32 API,用于获取命令行内容 5 HandleCommandLine(GetC

【温故Delphi】之VCL消息机制小结

TObject消息分派 procedure Dispatch(var Message); virtual; #负责分派消息到特定VCL组件的事件处理函数 procedure DefaultHandler(var Message); virtual; #消息分类:通过子类覆盖此方法,处理窗口命令消息,窗口标准消息,VCL自行触发消息,VCL通知消息,自定义 VCL封装类的方法种类 procedure WMButtonUp(var Message: TWMButtonUp); message WM_

DELPHI下API简述(1800个API)

DELPHI下API简述 http://zero.cnbct.org/show.asp?id=144 auxGetDevCaps API 获取附属设备容量 auxGetNumDevs API 返回附属设备数量 auxGetVolume API 获取当前卷设置 auxOutMessage API 向输出设备发送消息 auxSetVolume API 设置附属设备卷 AbortDoc API 终止一项打印作业 AbortPath API 终止或取消DC中的一切路径 AbortPrinter API

Delphi TThread中文注释

TThread是一个抽象类,可以创建几个独立的线程. 类关系 TObject 在一个多线程的应用程序中创建一个TThread的后子类代表一个线程.每一新子类的TThread对象的实例是一个新的线程.从TThread派生的多线程实例可以构成Delphi的多线程应用程序. 当一个应用程序运行时,应用程序就被载入内存准备执行.此时,它成为包含一个或多个线程的进程,每个线程含有数据.代码和系统资源.线程执行应用程序的部分内容,并由系统分配CPU时间.同一进程的所有线程共享同一地址空间,可以访问进程的全局

Delphi2007升级到Delphi 2010总结

这两天把一个使用Delphi2007成功升级到了Delphi2010.升级途中很艰辛,总结了 以下经验与大家分享.另外,D7使用的第三方组件,由于官方没有发布For Delphi2010的更新,修改的第三 方组件列表见文章尾部. 1,PChar因为Delphi不支持无类型指针的算术运算,很多程序员使用 PChar来代替Pointer,即使指针指向目标并不是PAnsiChar. 考虑如下代码: var    P:PChar;   Buffer:Pointer;begin   GetMem(Buff

温赵轮 访谈

“温赵轮”三大软狗,你听说过吗?今天的1024访谈录给大家介绍的就是程序员中当之无愧的偶像组合——温赵轮. Winter寒冬.阿里P8,正在向P9的道路上奔跑.传说中的他有钱.出身好,可不是搞互联网的屌丝程序员. 老赵,又名赵姐夫.小姨子遍天下.近几年奔波不断,从深圳到香港再到休斯敦,目前就职于美国最大银行摩根大通投行部,开发公司内部的交易程序. 轮子哥Vczh,@GeniusVczh.曾在微软亚洲研究院工作,现在在微软西雅图总部.是个对知乎潜在威胁很大的人,很多人取消对轮子哥的关注后反映没什么

P/Invoke .NET调用win32API

项目:无线无源测温软件系统 项目中,用到使用P/Invoke在.NET调用win32API,实现对ini配置文件的读写功能!因为有一些配置信息需要保存下来,以便在下一次启动程序完成初始化,这实际上是一种类持久化.将 一些信息写入INI文件(initialization file)中,可完成简单的持久化支持. Windows提供了API接口用于操作INI文件,其支持的INI文件格式一般如下: =============================== [Section1] Key11=valu