2017-10-05 26 views
0

私はいくつかのコードを維持しています。新しいコンパイラ、Visual Studio 2015にアップグレードした後、FT_HANDLEが次のコードに変換されますLPLONG。FT_HANDLEからLPLONG - 64ビットコンパイルへの変換を安全に行う方法

この変換を行い、警告を削除する安全な方法は何ですか?

#include <Windows.h> 
#include <iostream> 

typedef PVOID FT_HANDLE; 

void convert(FT_HANDLE ftHandle, LPLONG pPortNumber) { 

    *pPortNumber = reinterpret_cast<long>(ftHandle) & 0xFF; // problem here 
} 


int main() { 

    FT_HANDLE handle = malloc(10); // simulate a real handle 
    LONG portNumber(0); 
    convert(handle, &portNumber); 
    std::cout << "result=" << &portNumber << '\n'; 
    free(handle); 
} 

コンパイラの警告:

warning C4311: 'reinterpret_cast': pointer truncation from 'FT_HANDLE' to 'long' 
warning C4302: 'reinterpret_cast': truncation from 'FT_HANDLE' to 'long' 
+0

その警告は...正確には何ですか? –

+0

アドレスの下位8ビットはどのように対応していますか? – 1201ProgramAlarm

+0

@ 1201ProgramAlarmとは、 'FT_HANDLE'は_pointer_です。おそらく、アドレス自体ではなく、そのアドレスに値をキャストしたいと考えています。 'reinterpret_cast (* ftHandle)'を試してください。 –

答えて

0

安全な方法はこれを行うないです。コードは救済できないようです。

問題の最初の部分は、longが32ビットで、Win64ポインタがそうでないことです。

2番目の部分は、LPLONG portnumberが値渡しであることです。これは入力パラメータであり、出力パラメータではありません。

+0

それはかなり悪い合意です。しかし、LPLONGは長い*ので、逆参照と値の割り当ては少なくとも実行可能なことです。したがって、ポインタとして渡されると、呼び出し元は更新されたptr値を取得します。 –

+0

@AngusComber:あなたはポインタを理解することに問題があるようです。 'LPLONG pPortNumber'を指定すると、' pPortNumber'に値を代入するか、 '* pPortNumber'に値を代入することができます。 'pPortNumber'に値を代入しても、'&portNumber'または 'portNumber'の値は変更されません。呼び出し側は**そのように変更されたポインタを取得しません**。 – MSalters

関連する問題