E2250没有超载版本的' StrPas'可以使用这些参数调用

时间:2017-09-20 13:59:22

标签: delphi

我的代码:

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

2 个答案:

答案 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