小编Mic*_*ick的帖子

GetThreadLocale返回的值与GetUserDefaultLCID不同?

为了获得语言环境设置,例如短日期格式,我们总是使用GetLocaleFormatSettings和GetThreadLocale.到目前为止,这一直没有问题.

我们的几个用户获得的GetThreadLocale值与Windows 7中的区域设置中的配置值不同.无论我们尝试什么,我都无法重现这一点,但我向一位用户发送了测试用于获取区域设置信息的程序,并且足够确定GetThreadLocale返回与GetUserDefaultLCID(2057)不同的LCID(1033).因此,它们不是获取英国语言环境设置,而是最终使用美国语言环境设置.

我们是否错误地获取了区域设置信息?我们应该使用GetUserDefaultLCID而不是GetThreadLocale吗?

谢谢

delphi windows-7

16
推荐指数
3
解决办法
1万
查看次数

在UnicodeString中存储UTF-8字符串

在Delphi 2007中,您可以在WideString中存储UTF-8字符串,然后将其传递给Win32函数,例如

var
  UnicodeStr: WideString;
  UTF8Str: WideString;
begin
  UnicodeStr:='some unicode text';
  UTF8Str:=UTF8Encode(UnicodeStr);
  Windows.SomeFunction(PWideChar(UTF8Str), ...)
end;
Run Code Online (Sandbox Code Playgroud)

Delphi 2007不会干扰UTF8Str的内容,即它保留为存储在WideString中的UTF-8编码字符串.

但是在Delphi 2010中,我很难找到一种方法来做同样的事情,即将一个UTF-8编码的字符串存储在WideString中,而不会自动从UTF-8转换.我无法传递指向UTF-8字符串(或RawByteString)的指针,例如以下显然不起作用:

var
  UnicodeStr: WideString;
  UTF8Str: UTF8String;
begin
  UnicodeStr:='some unicode text';
  UTF8Str:=UTF8Encode(UnicodeStr);
  Windows.SomeFunction(PWideChar(UTF8Str), ...)
end;
Run Code Online (Sandbox Code Playgroud)

delphi string unicode utf-8 utf-16

9
推荐指数
1
解决办法
2万
查看次数

Delphi 2010广泛的功能与字符串功能

我们目前正在将Delphi 2007项目转换为Delphi 2010.我们已经在使用Unicode(通过WideStrings和TNT Unicode控件).

我期望将所有Wide函数(例如WideUpperCase)替换为等效的,例如UpperCase,但它们的工作方式不同.例如,WideUpperCase与UpperCase的工作方式不同.WideUpperCase正确地改变了Campañas,但是UpperCase以小写形式留下了ñ.

我应该注意哪些其他差异?例如,WideFormat和Format的工作原理是一样的吗?

谢谢

delphi unicode delphi-2007 widestring delphi-2010

8
推荐指数
1
解决办法
2241
查看次数

使用TAmazonStorageService.UploadObject在Content-type为'text/*'时出现SignatureDoesNotMatch错误

使用以下Delphi XE2(更新4)代码:

var
  ConInfo: TAmazonConnectionInfo;
  RespInfo: TCloudResponseInfo;
  Service: TAmazonStorageService;
  Content: TBytes;
  Headers: TStringList;
begin
  ConInfo:=TAmazonConnectionInfo.Create(self);
  ConInfo.AccountName:='YOUR ACCOUNT NAME';
  ConInfo.AccountKey:='YOUR ACCOUNT KEY';
  ConInfo.Protocol:='http';

  Service:=TAmazonStorageService.Create(ConInfo);
  RespInfo:=TCloudResponseInfo.Create;

  SetLength(Content, 128);
  FillMemory(@Content[0], 128, Byte('x'));

  Headers:=TStringList.Create;
  Headers.Values['Content-type']:='text/plain';
  if not Service.UploadObject('YOUR BUCKET', 'test.txt', Content, TRUE, nil, Headers, amzbaPrivate, RespInfo) then
    ShowMessage('Failed:' + RespInfo.StatusMessage);
Run Code Online (Sandbox Code Playgroud)

我总是在调用UploadObject时遇到错误:

失败:HTTP/1.1 403禁止 - 我们计算的请求签名与您提供的签名不匹配.检查您的密钥和签名方法.(SignatureDoesNotMatch)

仅当Content-type设置为'text/plain','text/html'或文本内容时才会发生这种情况.使用完全相同的代码,如果您只是将内容类型更改为任何其他内容类型,例如"video/3gpp",那么它将按预期工作且没有错误.上传的对象的实际内容不相关,与获取错误无关.

我已经通过Delphi中的Indy代码进行了跟踪,但是我很难理解为什么文本内容类型总是会出现这个错误.

有任何想法吗?

delphi content-type indy amazon-s3 http-status-code-403

6
推荐指数
1
解决办法
778
查看次数

适用于Delphi 2010的Amazon S3组件

除了/ n软件中的Amazon Integrator,是否还有其他可与Delphi 2010一起使用的Amazon S3组件?我将使用/ n软件中的那个,但是它存在一些问题(例如,如果对象存储在特定位置,则GetObjectInfo不起作用)和限制(例如,复制对象不允许您定义替换元数据)。

我没有时间或资源自己创建这样的组件。

谢谢!

delphi components amazon-s3 delphi-2010

5
推荐指数
1
解决办法
1792
查看次数

访问冲突在XE2中强制转换IDispatch

我们正在使用一些旧代码(由Binh Ly创建的ComLib.pas),因此我们可以在(OleVariant)对象上使用枚举接口:

type
  TDispNewEnum = dispinterface
    ['{97079E31-6957-11D2-9154-0000B4552A26}'] // dummy
    property _NewEnum: IUnknown readonly dispid -4; // DISPID_NEWENUM
    function _NewEnumFunc: IUnknown; dispid -4; // DISPID_NEWENUM
  end;

procedure TEnumVariant.AttachUnknown (const Unk: IUnknown);
var
  pDisp: IDispatch;
  _NewEnumPropFailed: boolean;
  Unknown: IUnknown;
begin
  Detach;
  Unknown := Unk;
  { extract IEnumVariant }
  if (Unknown <> nil) then
  begin
    { try IEnumVariant }
    if not (Succeeded (Unknown.QueryInterface (IEnumVariant, FEnumVariant))) then
    begin
      FEnumVariant := nil;  // safety!

      { test _NewEnum prop and _NewEnum func }
      if (Succeeded (Unknown.QueryInterface …
Run Code Online (Sandbox Code Playgroud)

delphi idispatch queryinterface iunknown delphi-xe2

3
推荐指数
1
解决办法
1392
查看次数

在已排序的TStringList中搜索带有前缀的条目(StartsText)

我有一个TStringList,它被排序并包含唯一的文件名.该列表可以是任何大小(因此它可以是数十万个条目).我想检查是否有任何条目以特定字符串开头(即文件是否在子文件夹中).串行扫描列表并使用StartsText很容易,但这不是一个理想的解决方案.

使用TStringList.Find()代码作为起点,我创建了一个我认为是解决方案的函数,但我想确定.不要担心以下不是类的成员(FList是被搜索的TStringList实例),StartsFilename的工作方式与StartsText相同:

  function ShortcutFind(const S: string): Boolean;
  var
    L, H, I, C: Integer;
  begin
    Result := False;
    L := 0;
    H := FList.Count - 1;
    while L <= H do begin
      I := (L + H) shr 1;

      if TFilenameUtils.StartsFilename(FList[I], aFolder) then begin
        Result:=TRUE;
        Exit;
      end;

      C := FList.CompareStrings(FList[I], S);
      if C < 0 then
        L := I + 1
      else begin
        H := I - 1;
        if C = 0 then begin
          Result := True;
          if FList.Duplicates <> dupAccept …
Run Code Online (Sandbox Code Playgroud)

delphi tstringlist

1
推荐指数
1
解决办法
857
查看次数