delphi 朝鲜语的PathMatchSpec()出现问题

vc9ivgsu  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(114)

函数PathMatchSpec()PathMatchSpecEx()返回不正确的朝鲜语结果。
在下面的测试程序中,名称为"수납파일",掩码为"수납*"
如果Windows语言为英语或德语,则运行良好。
如果Windows语言为朝鲜语,则两个函数都返回不正确的结果。
我应该如何使用这些函数才能使它们在所有语言中正常工作?
我不懂韩语。在Windows 10和11上用 Delphi 10.4.2测试过。
C++控制台:

#include <iostream>
#include <shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
int main()
{
    if (PathMatchSpec(L"수납파일", L"수납*"))
       std::cout << "PathMatchSpec success!\n";
    else
        std::cout << "PathMatchSpec failed!\n";

    if (PathMatchSpecEx(L"수납파일", L"수납*", PMSF_NORMAL)==S_OK)
        std::cout << "PathMatchSpecEx success!\n";
    else
        std::cout << "PathMatchSpecEx failed!\n";
}

测试程序:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages,Winapi.ShLwApi,
  System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    Button1: TButton;
    Label3: TLabel;
    Button2: TButton;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    

  function PathMatchSpecEx(pszFile, pszSpec: LPCWSTR; dwFlags: DWORD ): HRESULT; stdcall;
  {$EXTERNALSYM PathMatchSpecEx}
var
  Form1: TForm1;

implementation

{$R *.dfm}

function PathMatchSpecEx; external 'shlwapi.dll' name 'PathMatchSpecExW';    

procedure TForm1.FormCreate(Sender: TObject);
var fileName, fileMask: string;
begin
  fileName := '수납파일';
  fileMask:= '수납*';

  Edit1.Text := fileName;
  Edit2.Text := fileMask;   

end;   

procedure TForm1.Button1Click(Sender: TObject);
var fileName, fileMask: string;
begin
  fileName := Edit1.Text;
  fileMask := Edit2.Text;

  if PathMatchSpecEx(PChar(fileName), PChar(fileMask),0)=S_OK then
     Label3.Caption := 'Success!'
  else
     Label3.Caption := 'PathMatchSpecEx failed!';
end;

procedure TForm1.Button2Click(Sender: TObject);
var fileName, fileMask: string;
begin
  fileName := Edit1.Text;
  fileMask := Edit2.Text;

  if PathMatchSpec(PChar(fileName), PChar(fileMask)) then
     Label4.Caption := 'Success!'
  else
     Label4.Caption := 'PathMatchSpec failed!';
end;

end.
rfbsl7qr

rfbsl7qr1#

正如您在注解中所说的,源文件的代码页会产生影响。下面的代码解释了所发生的事情。

#include<windows.h>
#include <iostream>
#include <wchar.h>
#include <shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")

PCHAR convert(PTCHAR p)
{
    int size = WideCharToMultiByte(50225, 0, p, -1, NULL, 0, NULL, NULL);
    PCHAR c = (PCHAR)malloc(size);
    int error = WideCharToMultiByte(50225, 0, p, -1, c, size, NULL, NULL);
    if (error == 0)
    {
        DWORD d = GetLastError();
    }
    return c;
}

int main()
{
    TCHAR a[] = L"수납파일";
    TCHAR b[] = L"수납*";

    PCHAR c = convert(a);
    PCHAR d = convert(b);
    //d[9] = '\x2a';
    //d[10] = '\x0';
    if (PathMatchSpec(a, b))
        std::cout << "PathMatchSpec success!\n";
    else
        std::cout << "PathMatchSpec failed!\n";

    if (PathMatchSpecEx(a, b, PMSF_NORMAL) == S_OK)
        std::cout << "PathMatchSpecEx success!\n";
    else
        std::cout << "PathMatchSpecEx failed!\n";

    if (PathMatchSpecA(c, d))
        std::cout << "PathMatchSpec success!\n";
    else
        std::cout << "PathMatchSpec failed!\n";

    if (PathMatchSpecExA(c, d, PMSF_NORMAL) == S_OK)
        std::cout << "PathMatchSpecEx success!\n";
    else
        std::cout << "PathMatchSpecEx failed!\n";
}

以代码页50225保存源文件。

总体


b

以Unicode代码页65001保存源文件。

总体


b

c

基因
d

\

相关问题