我的代码:
function ThisModuleName: Char; //bulo String
var
p: array [0..512] of char;
fileNamePart: pchar;
begin
GetModuleFileName(HInstance, @p[0], 512);
GetFullPathName(@p[0], 512, @p[0], fileNamePart);
result := StrPas(WideString(@p[0])); //stalo WideString
end;
在Delphi 7中编译。 在Delphi 10.2中,它给出了一个错误:
[dcc32 Error] verinfo.pas(98): E2250 There is no overloaded version of 'StrPas' that can be called with these arguments
答案 0 :(得分:4)
此代码在所有Delphi版本上都是错误的。我怀疑它在任何地方编译。我猜你所提供的代码不是Delphi 7代码,而是你在攻击它一段时间之后的代码。
返回类型应为string
而不是char
。此外,WideString
的演员是虚假的。最后,从零开始的字符数组可以视为PChar
。
你的功能应该这样翻译:
function ThisModuleName: string;
var
p: array [0..511] of Char;
fileNamePart: PChar;
begin
GetModuleFileName(HInstance, p, Length(p));
GetFullPathName(p, Length(p), p, fileNamePart);
Result := p;
end;
说完所有这些,虽然这是对问题中代码的忠实翻译,但它不会返回模块名称。我真的不知道您的代码尝试了什么,但是代码中对GetFullPathName
的调用似乎是错误的。
我的猜测是你试图将潜在的短8.3文件名转换成长名。我相信你需要一个额外的缓冲来使这项工作。这是代码的样子,添加了一些错误检查:
function ThisModuleName: string;
var
ModuleFileName, Buffer: array [0..511] of Char;
FilePart: PChar;
begin
Win32Check(GetModuleFileName(HInstance, ModuleFileName, Length(ModuleFileName))<>0);
Win32Check(GetFullPathName(ModuleFileName, Length(Buffer), Buffer, FilePart)<>0);
Result := Buffer;
end;
不是在您的移植项目中遇到的每个问题都提出问题,而是可以花更多的钱来学习更多关于Unicode Delphi的知识。
答案 1 :(得分:2)
不是直接调用API,而是调用System.SysUtils.GetModuleName,它只返回一个字符串。
它包装了GetModuleFilename,通过这样做,它还显示了如何调用该函数。我希望我能从上述单位引用几行。它还使用MAX_PATH常量,该常量包含路径的最大长度。
请注意,GetModuleFilename已经返回一个完全限定的路径,因此之后调用GetFullPathName是多余的。
function GetModuleName(Module: HMODULE): string;
var
ModName: array[0..MAX_PATH] of Char;
begin
SetString(Result, ModName, GetModuleFileName(Module, ModName, Length(ModName)));
end;
如果您想要dll的路径,这非常有用,如果您对主要可执行文件感兴趣,则只需使用Application.ExeName
。