0

みんなの夕方、私は誰かが私に2つの簡単な質問に答えることができるかどうか疑問に思いました。

正常に動作するアームデバイスと通信するアプリを作成しましたが、PCなどを移動する場合は、デバイスパスを再構成する必要があります。以下のような長いものです。

道:\\?\usb#vid_045e&pid_0040#6&ff454f2&0&3#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

いくつか読んでみたところ、2つの機能が必要SetupDiGetClassDevsSetupDiGetDeviceInstanceIdあることがわかりました。私の質問は、私が正しい場所を探しているかどうかです。つまり、これらの2つの関数は上記のようなパスを返しますか。また、このパスの技術的な名前は何ですか?

以下のMicrosoftのWebサイトで、良い例(常に例からよりよく学ぶ)だと思うものを見つけましたが、C2440: '=' : cannot convert from 'HLOCAL' to 'LPTSTR' これは私にとって新しいものであるエラーをスローしますポインターエラー?

これはコードです

   #include <stdio.h>
   #include <windows.h>
   #include <setupapi.h>
   #include <devguid.h>
   #include <regstr.h>

   int main( int argc, char *argv[ ], char *envp[ ] )
   {
       HDEVINFO hDevInfo;
       SP_DEVINFO_DATA DeviceInfoData;
       DWORD i;

       // Create a HDEVINFO with all present devices.
       hDevInfo = SetupDiGetClassDevs(NULL,
           0, // Enumerator
           0,
           DIGCF_PRESENT | DIGCF_ALLCLASSES );

       if (hDevInfo == INVALID_HANDLE_VALUE)
       {
           // Insert error handling here.
           return 1;
       }

       // Enumerate through all devices in Set.

       DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
       for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
           &DeviceInfoData);i++)
       {
           DWORD DataT;
           LPTSTR buffer = NULL;
           DWORD buffersize = 0;

           //
           // Call function with null to begin with, 
           // then use the returned buffer size (doubled)
           // to Alloc the buffer. Keep calling until
           // success or an unknown failure.
           //
           //  Double the returned buffersize to correct
           //  for underlying legacy CM functions that 
           //  return an incorrect buffersize value on 
           //  DBCS/MBCS systems.
           // 
           while (!SetupDiGetDeviceRegistryProperty(
               hDevInfo,
               &DeviceInfoData,
               SPDRP_DEVICEDESC,
               &DataT,
               (PBYTE)buffer,
               buffersize,
               &buffersize))
           {
               if (GetLastError() == 
                   ERROR_INSUFFICIENT_BUFFER)
               {
                   // Change the buffer size.
                   if (buffer) LocalFree(buffer);
                   // Double the size to avoid problems on 
                   // W2k MBCS systems per KB 888609. 
                   buffer = LocalAlloc(LPTR,buffersize * 2); // ERROR LINE
               }
               else
               {
                   // Insert error handling here.
                   break;
               }
           }

           printf("Result:[%s]\n",buffer);

           if (buffer) LocalFree(buffer);
       }


       if ( GetLastError()!=NO_ERROR &&
            GetLastError()!=ERROR_NO_MORE_ITEMS )
       {
           // Insert error handling here.
           return 1;
       }

       //  Cleanup
       SetupDiDestroyDeviceInfoList(hDevInfo);

       return 0;
   }

簡単なことを願っていますありがとうございます。

4

1 に答える 1

0

からの戻り値を型キャストする必要がありますLocalAlloc()

buffer = (LPSTR) LocalAlloc(LPTR,buffersize * 2);

詳細については、MSDNのLocalAlloc()ドキュメントを参照してください。

于 2012-07-25T02:02:54.993 に答える