2016-05-12 7 views
0

背景:Delphi 10.1 Berlinに自分のコードを移植し、サードパーティのライブラリを使って作業しています。いくつかはもはや利用できませんので、私はコードを修正しようとします。Delphi 2007-> 10.1 Berlin Port:E2251の解決StrLenへのあいまいなオーバーロード呼び出し

次のコード(プログラムのあるインスタンスから別のインスタンスにパラメータを渡す)は、E2251 StrLenへのあいまいなオーバーロード呼び出しを発生させます。私はなぜそれを解決するための最良の方法が分からないのか理解しています。デフォルトでは

type 
    PInstInfo = ^TInstInfo; 
    TInstInfo = packed record 
    FirstInstanceWnd:HWND; 
    ParamCount:Integer; 
    Params:Array[0..MAX_PARAMS-1, 0..MAX_PARAM_SIZE] of Char; 
    end; 

// Memory is filled with: 
lpInfo^.ParamCount:=ParamCount; 
if lpInfo^.ParamCount>MAX_PARAMS then 
    lpInfo^.ParamCount:=MAX_PARAMS; 
for i:=0 to lpInfo^.ParamCount-1 do 
begin 
    tempStr:=ParamStr(i+1); 
    if length(tempStr)>MAX_PARAM_SIZE then 
    setLength(tempStr,MAX_PARAM_SIZE); 
    StrCopy(@(lpInfo^.Params[i,0]),PChar(tempStr)); 
end; 
// and notify the first instance 
PostMessage(lpInfo^.FirstInstanceWnd, MSG_2ND_INSTANCE, 0, 0); 



// And read using: 
    if lpInfo <> nil then 
    try 
    // get Parameters 
    params:=TStringList.Create; 
    try 
    for i:=0 to lpInfo^.ParamCount-1 do 
    begin 
     SetString(tempStr, 
     PChar(@(lpInfo^.Params[i,0])), 
     StrLen(@(lpInfo^.Params[i,0]))); <--- E2251 Ambiguious overloaded call to StrLen 
     params.Add(tempStr); 
    end; 
    InstanceStarted(params); 
    finally 
    params.Free; 
    end; 

おかげ

答えて

1

@アドレス演算子は型なしのポインタを生成します。 StrLen()の2つのオーバーロードされたバージョンがあります.1つはPAnsiChar、もう一つはPWideCharです。タイプのないポインタは、両方のオーバーロードに渡すことができます。したがって、あいまいさがあります。 Delphi 2007では、PWideCharのオーバーロードが存在しませんでした。そのため、以前にコードがコンパイルされていました。

  1. はそう型付けPCharポインタを生成します@演算子を使用してChar変数のアドレスを取っType-checked pointersを有効にする{$TYPEDADDRESS ON}または{$T+}コンパイラディレクティブを使用します。

    コードを修正するには、いずれかする必要がありますタイプのないポインタの代わりに。ヌル終端文字ポインタをすることができるので、

    SetString(tempStr, 
        PChar(@(lpInfo^.Params[i,0])), 
        StrLen(PChar(@(lpInfo^.Params[i,0])))); 
    
  2. SetString()StrLen()への呼び出しを取り除く:

    {$TYPEDADDRESS ON} 
    SetString(tempStr, 
        @(lpInfo^.Params[i,0]), 
        StrLen(@(lpInfo^.Params[i,0]))); 
    
  3. あなたはSetString()の第二パラメータで使用するのと同じタイプキャストを使用します

    tempStr := PChar(@(lpInfo^.Params[i,0])); 
    

    String変数に直接割り当て言ったことで
    {$TYPEDADDRESS ON} 
    tempStr := @(lpInfo^.Params[i,0]); 
    

、あなたのアプリケーションのUnicodeのバージョンに、ではないのANSIバージョンにパラメータを送信するときにCharデータ型はD2009にANSIからUnicodeに変更するので、このコードはのみ動作することに注意してください。以前のバージョンのアプリケーションを引き続きサポートする必要がある場合は、Unicodeパラメータを渡すための別のウィンドウメッセージを定義してから、Unicodeアプリケーションで受信用の両方のメッセージをサポートし、ターゲットメッセージHWNDを分析して、

+0

ありがとう、私がこのプロジェクトを移植するのは、それが私を殺した場合です – Xaz

関連する問題