Delphi 不兼容类型:';WideChar';和';Char';德尔福7

Delphi 不兼容类型:';WideChar';和';Char';德尔福7,delphi,error-handling,delphi-7,Delphi,Error Handling,Delphi 7,使用shellexecute调用外部程序时,我的delphi代码中出现错误 procedure TReceiverMainForm.btnSearchClick(Sender: TObject); var args:string; begin mmoResult.Clear; // args := ' /d=' + TIdURI.URLEncode(Trim(sSearch)) + ' /t=ReceiverMainForm /s=30 /m=1' args := ' /q='

使用shellexecute调用外部程序时,我的delphi代码中出现错误

procedure TReceiverMainForm.btnSearchClick(Sender: TObject);
 var
  args:string;
begin
  mmoResult.Clear;
//  args := ' /d='  + TIdURI.URLEncode(Trim(sSearch)) + ' /t=ReceiverMainForm /s=30 /m=1'
args := ' /q='  + httpencode(Trim(txtSearch.Text)) + ' /t=ReceiverMainForm /s='+Trim(txtS.Text)+' /m='+Trim(txtM.Text);
  ShellExecute(Handle, 'open', 'YTD.exe', pWideChar(args), nil, SW_SHOWNORMAL);
end;
如何解决此错误?

函数的定义如下

function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: PChar; ShowCmd: Integer): HINST; stdcall;
因此,问题是您正在将
args
变量强制转换为
PWideChar
,而不是
PChar

试试这个代码

ShellExecute(Handle, 'open', 'YTD.exe', PChar(args), nil, SW_SHOWNORMAL);
请记住,Delphi7早于Unicode Delphi开发。因此,
PChar
是8位字符类型的别名,
PAnsiChar
函数的定义如下

function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
  Directory: PChar; ShowCmd: Integer): HINST; stdcall;
因此,问题是您正在将
args
变量强制转换为
PWideChar
,而不是
PChar

试试这个代码

ShellExecute(Handle, 'open', 'YTD.exe', PChar(args), nil, SW_SHOWNORMAL);

请记住,Delphi7早于Unicode Delphi开发。因此,
PChar
是8位字符类型的别名,
PAnsiChar

也许,您应该尝试
ShellExecuteW
。@Andriy这将修复编译错误,但代码在运行时会失败。需要args也是宽字符串。因为args是由8位数据构建的,所以使用宽API没有任何好处。@DavidHeffernan:啊,是的,你是对的。不知道为什么我没有注意到
args
的类型。即使有效,也没有必要使用Unicode版本而不是ANSI版本,因为原始字符串不是Unicode版本。也许,您应该尝试使用
ShellExecuteW
。@Andriy这将修复编译错误,但代码在运行时会失败。需要args也是宽字符串。因为args是由8位数据构建的,所以使用宽API没有任何好处。@DavidHeffernan:啊,是的,你是对的。不知道为什么我没有注意到
args
的类型。即使有效,也没有必要使用Unicode版本而不是ANSI版本,因为原始字符串不是Unicode版本。