<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[USB finden]]></title><description><![CDATA[<p>Hi</p>
<p>ich soll ein programm schreiben, das testen soll ob ein usb device mit einer angegebenen VendorID und ProductID existiert oder nicht. bzw darauf wartet ob es gesteckt oder gezogen wird.</p>
<p>Gibt es eine einfachere möglichkeit als den ganzen USB bus (baum) von den Roothubs aus aubzuskannen?</p>
<p>gruss Termite</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/92925/usb-finden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 09:34:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/92925.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Nov 2004 15:44:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to USB finden on Wed, 24 Nov 2004 15:44:20 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>ich soll ein programm schreiben, das testen soll ob ein usb device mit einer angegebenen VendorID und ProductID existiert oder nicht. bzw darauf wartet ob es gesteckt oder gezogen wird.</p>
<p>Gibt es eine einfachere möglichkeit als den ganzen USB bus (baum) von den Roothubs aus aubzuskannen?</p>
<p>gruss Termite</p>
]]></description><link>https://www.c-plusplus.net/forum/post/658143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/658143</guid><dc:creator><![CDATA[Termite_]]></dc:creator><pubDate>Wed, 24 Nov 2004 15:44:20 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Wed, 24 Nov 2004 16:06:51 GMT]]></title><description><![CDATA[<p>man schreibt.. &quot;abzuscannen&quot;</p>
<p>mfG (c)h</p>
]]></description><link>https://www.c-plusplus.net/forum/post/658169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/658169</guid><dc:creator><![CDATA[chille07]]></dc:creator><pubDate>Wed, 24 Nov 2004 16:06:51 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Wed, 24 Nov 2004 18:49:56 GMT]]></title><description><![CDATA[<p>cool chille! das hats jetzt echt gebraucht..<br />
wenn wir solche leute nicht hätten, die auf unsere schöne deutsche sprache aufpassen..<br />
hey, ich glaub, das ich würde bald selbstmord begehen..<br />
dir muss man echt einen orden verleihen:</p>
<p><strong>=&gt; RETTER DER DEUTSCHEN SPRACHE &lt;=</strong></p>
<pre><code>:live:    :live:    :live:
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/658323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/658323</guid><dc:creator><![CDATA[nate7]]></dc:creator><pubDate>Wed, 24 Nov 2004 18:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Wed, 24 Nov 2004 20:31:56 GMT]]></title><description><![CDATA[<p>aber ob &quot;scannen&quot; nun wirklich DEUTSCH ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> , oder aus dem Englischen kommt :p ...</p>
<p>mfG (c)h</p>
]]></description><link>https://www.c-plusplus.net/forum/post/658420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/658420</guid><dc:creator><![CDATA[chille07]]></dc:creator><pubDate>Wed, 24 Nov 2004 20:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Sat, 27 Nov 2004 17:33:11 GMT]]></title><description><![CDATA[<p>Statt euch über Deutsch zu streiten, postet mal lieber eine Lösung!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/660661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660661</guid><dc:creator><![CDATA[C++ Core]]></dc:creator><pubDate>Sat, 27 Nov 2004 17:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Sat, 27 Nov 2004 17:49:23 GMT]]></title><description><![CDATA[<p>*gg* würde ich ja wirklich sehr sehr gerne machen, wenn...<br />
... ich eine Lösung wüsste <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>sorry, aber WinAPI ist nicht mein Spezialgebiet...</p>
<p>mfG (c)h</p>
]]></description><link>https://www.c-plusplus.net/forum/post/660671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660671</guid><dc:creator><![CDATA[chille07]]></dc:creator><pubDate>Sat, 27 Nov 2004 17:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Sat, 27 Nov 2004 18:03:53 GMT]]></title><description><![CDATA[<p>Ja meins auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ,<br />
wüsste aber trotzdem gerne wie es geht!</p>
<p>MfG,<br />
C+ Core</p>
]]></description><link>https://www.c-plusplus.net/forum/post/660682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/660682</guid><dc:creator><![CDATA[C++ Core]]></dc:creator><pubDate>Sat, 27 Nov 2004 18:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to USB finden on Sun, 30 Jan 2005 15:40:50 GMT]]></title><description><![CDATA[<p>Nachdem du dich in Bezug auf das Gerät sehr zurückhälst, hier ein Beispielcode,<br />
um ein HID Device zu finden. Die HID Struktur bezieht sich hier nicht auf<br />
Keyboards oder Mäuse !!<br />
Es handelt sich um den Beispielcode der HIDPAGE. Der interressante Teil dürfte<br />
für dich wohl die Funktion FindTheHID sein ??</p>
<pre><code>bool CUsbhidiocDlg::FindTheHID()
{
	//Use a series of API calls to find a HID with a matching Vendor and Product ID.

	HIDD_ATTRIBUTES						Attributes;
	SP_DEVICE_INTERFACE_DATA			devInfoData;
	bool								LastDevice = FALSE;
	int									MemberIndex = 0;
	bool								MyDeviceDetected = FALSE; 
	LONG								Result;

	//These are the vendor and product IDs to look for.
	//Uses Lakeview Research's Vendor ID.
	const unsigned int VendorID = 0x04D8;
	const unsigned int ProductID = 0x1110;

	Length = 0;
	detailData = NULL;
	DeviceHandle=NULL;

	/*
	API function: HidD_GetHidGuid
	Get the GUID for all system HIDs.
	Returns: the GUID in HidGuid.
	*/

	HidD_GetHidGuid(&amp;HidGuid);	

	/*
	API function: SetupDiGetClassDevs
	Returns: a handle to a device information set for all installed devices.
	Requires: the GUID returned by GetHidGuid.
	*/

	hDevInfo=SetupDiGetClassDevs 
		(&amp;HidGuid, 
		NULL, 
		NULL, 
		DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);

	devInfoData.cbSize = sizeof(devInfoData);

	//Step through the available devices looking for the one we want. 
	//Quit on detecting the desired device or checking all available devices without success.
	MemberIndex = 0;
	LastDevice = FALSE;

	do
	{
		MyDeviceDetected=FALSE;

		/*
		API function: SetupDiEnumDeviceInterfaces
		On return, MyDeviceInterfaceData contains the handle to a
		SP_DEVICE_INTERFACE_DATA structure for a detected device.
		Requires:
		The DeviceInfoSet returned in SetupDiGetClassDevs.
		The HidGuid returned in GetHidGuid.
		An index to specify a device.
		*/

		Result=SetupDiEnumDeviceInterfaces 
			(hDevInfo, 
			0, 
			&amp;HidGuid, 
			MemberIndex, 
			&amp;devInfoData);

		if (Result != 0)
		{
			//A device has been detected, so get more information about it.

			/*
			API function: SetupDiGetDeviceInterfaceDetail
			Returns: an SP_DEVICE_INTERFACE_DETAIL_DATA structure
			containing information about a device.
			To retrieve the information, call this function twice.
			The first time returns the size of the structure in Length.
			The second time returns a pointer to the data in DeviceInfoSet.
			Requires:
			A DeviceInfoSet returned by SetupDiGetClassDevs
			The SP_DEVICE_INTERFACE_DATA structure returned by SetupDiEnumDeviceInterfaces.

			The final parameter is an optional pointer to an SP_DEV_INFO_DATA structure.
			This application doesn't retrieve or use the structure.			
			If retrieving the structure, set 
			MyDeviceInfoData.cbSize = length of MyDeviceInfoData.
			and pass the structure's address.
			*/

			//Get the Length value.
			//The call will return with a &quot;buffer too small&quot; error which can be ignored.
			Result = SetupDiGetDeviceInterfaceDetail 
				(hDevInfo, 
				&amp;devInfoData, 
				NULL, 
				0, 
				&amp;Length, 
				NULL);

			//Allocate memory for the hDevInfo structure, using the returned Length.
			detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length);

			//Set cbSize in the detailData structure.
			detailData -&gt; cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

			//Call the function again, this time passing it the returned buffer size.
			Result = SetupDiGetDeviceInterfaceDetail 
				(hDevInfo, 
				&amp;devInfoData, 
				detailData, 
				Length, 
				&amp;Required, 
				NULL);

			//Open a handle to the device.

			/*
			API function: CreateFile
			Returns: a handle that enables reading and writing to the device.
			Requires:
			The DevicePath in the detailData structure
			returned by SetupDiGetDeviceInterfaceDetail.
			*/

			DeviceHandle=CreateFile 
				(detailData-&gt;DevicePath, 
				GENERIC_READ|GENERIC_WRITE, 
				FILE_SHARE_READ|FILE_SHARE_WRITE, 
				(LPSECURITY_ATTRIBUTES)NULL,
				OPEN_EXISTING, 
				0, 
				NULL);

			DisplayLastError(&quot;CreateFile: &quot;);

			/*
			API function: HidD_GetAttributes
			Requests information from the device.
			Requires: the handle returned by CreateFile.
			Returns: a HIDD_ATTRIBUTES structure containing
			the Vendor ID, Product ID, and Product Version Number.
			Use this information to decide if the detected device is
			the one we're looking for.
			*/

			//Set the Size to the number of bytes in the structure.
			Attributes.Size = sizeof(Attributes);

			Result = HidD_GetAttributes 
				(DeviceHandle, 
				&amp;Attributes);

			DisplayLastError(&quot;HidD_GetAttributes: &quot;);

			//Is it the desired device?
			MyDeviceDetected = FALSE;

			if (Attributes.VendorID == VendorID)
			{
				if (Attributes.ProductID == ProductID)
				{
					//Both the Product and Vendor IDs match.
					MyDeviceDetected = TRUE;
					DisplayData(&quot;Device detected&quot;);
					//Get the device's capablities.
					GetDeviceCapabilities();
					PrepareForOverlappedTransfer();
				} //if (Attributes.ProductID == ProductID)

				else
					//The Product ID doesn't match.
					CloseHandle(DeviceHandle);
			} //if (Attributes.VendorID == VendorID)

			else
				//The Vendor ID doesn't match.
				CloseHandle(DeviceHandle);

		//Free the memory used by the detailData structure (no longer needed).
		free(detailData);
		}  //if (Result != 0)

		else
			//SetupDiEnumDeviceInterfaces returned 0, so there are no more devices to check.
			LastDevice=TRUE;

		//If we haven't found the device yet, and haven't tried every available device,
		//try the next one.
		MemberIndex = MemberIndex + 1;

	} //do
	while ((LastDevice == FALSE) &amp;&amp; (MyDeviceDetected == FALSE));

	if (MyDeviceDetected == FALSE)
		DisplayData(&quot;Device not detected&quot;);
	else
		DisplayData(&quot;Device detected&quot;);

	//Free the memory reserved for hDevInfo by SetupDiClassDevs.
	SetupDiDestroyDeviceInfoList(hDevInfo);
	DisplayLastError(&quot;SetupDiDestroyDeviceInfoList&quot;);

	return MyDeviceDetected;
}

void CUsbhidiocDlg::GetDeviceCapabilities()
{
	//Get the Capabilities structure for the device.
	PHIDP_PREPARSED_DATA	PreparsedData;

	/*
	API function: HidD_GetPreparsedData
	Returns: a pointer to a buffer containing the information about the device's capabilities.
	Requires: A handle returned by CreateFile.
	There's no need to access the buffer directly,
	but HidP_GetCaps and other API functions require a pointer to the buffer.
	*/

	HidD_GetPreparsedData 
		(DeviceHandle, 
		&amp;PreparsedData);
	DisplayLastError(&quot;HidD_GetPreparsedData: &quot;);

	/*
	API function: HidP_GetCaps
	Learn the device's capabilities.
	For standard devices such as joysticks, you can find out the specific
	capabilities of the device.
	For a custom device, the software will probably know what the device is capable of,
	and the call only verifies the information.
	Requires: the pointer to the buffer returned by HidD_GetPreparsedData.
	Returns: a Capabilities structure containing the information.
	*/

	HidP_GetCaps 
		(PreparsedData, 
		&amp;Capabilities);
	DisplayLastError(&quot;HidP_GetCaps: &quot;);

	//Display the capabilities

	ValueToDisplay.Format(&quot;%s%X&quot;, &quot;Usage Page: &quot;, Capabilities.UsagePage);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Input Report Byte Length: &quot;, Capabilities.InputReportByteLength);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Output Report Byte Length: &quot;, Capabilities.OutputReportByteLength);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Feature Report Byte Length: &quot;, Capabilities.FeatureReportByteLength);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Link Collection Nodes: &quot;, Capabilities.NumberLinkCollectionNodes);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Input Button Caps: &quot;, Capabilities.NumberInputButtonCaps);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of InputValue Caps: &quot;, Capabilities.NumberInputValueCaps);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of InputData Indices: &quot;, Capabilities.NumberInputDataIndices);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Output Button Caps: &quot;, Capabilities.NumberOutputButtonCaps);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Output Value Caps: &quot;, Capabilities.NumberOutputValueCaps);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Output Data Indices: &quot;, Capabilities.NumberOutputDataIndices);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Feature Button Caps: &quot;, Capabilities.NumberFeatureButtonCaps);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Feature Value Caps: &quot;, Capabilities.NumberFeatureValueCaps);
	DisplayData(ValueToDisplay);
	ValueToDisplay.Format(&quot;%s%d&quot;, &quot;Number of Feature Data Indices: &quot;, Capabilities.NumberFeatureDataIndices);
	DisplayData(ValueToDisplay);

	//No need for PreparsedData any more, so free the memory it's using.
	HidD_FreePreparsedData(PreparsedData);
	DisplayLastError(&quot;HidD_FreePreparsedData: &quot;) ;
}

void CUsbhidiocDlg::PrepareForOverlappedTransfer()
{
	//Get another handle to the device for the overlapped ReadFiles.
	ReadHandle=CreateFile 
		(detailData-&gt;DevicePath, 
		GENERIC_READ|GENERIC_WRITE, 
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		(LPSECURITY_ATTRIBUTES)NULL, 
		OPEN_EXISTING, 
		FILE_FLAG_OVERLAPPED, 
		NULL);
	DisplayLastError(&quot;CreateFile (ReadHandle): &quot;);

	//Get an event object for the overlapped structure.

	/*API function: CreateEvent
	Requires:
	  Security attributes or Null
	  Manual reset (true). Use ResetEvent to set the event object's state to non-signaled.
	  Initial state (true = signaled) 
	  Event object name (optional)
	Returns: a handle to the event object
	*/

	if (hEventObject == 0)
	{
		hEventObject = CreateEvent 
			(NULL, 
			TRUE, 
			TRUE, 
			&quot;&quot;);
	DisplayLastError(&quot;CreateEvent: &quot;) ;

	//Set the members of the overlapped structure.
	HIDOverlapped.hEvent = hEventObject;
	HIDOverlapped.Offset = 0;
	HIDOverlapped.OffsetHigh = 0;
	}
}

void CUsbhidiocDlg::ReadAndWriteToDevice()
{
	//If we haven't done so already, find the device and learn its capabilities.
	//Then send a report and request a report.
	//The test device firmware (usbhidio) adds 1 to each byte received in an OUT report
	//and sends the results back in the next IN report.

	//Clear the List Box (optional).
	//m_ResultsList.ResetContent();

	{
	DisplayData(&quot;***HID Test Report***&quot;);
	DisplayCurrentTime();

	//If the device hasn't been detected already, look for it.
	if (DeviceDetected==FALSE)
		DeviceDetected=FindTheHID();

	if (DeviceDetected==TRUE)
		{
			//Write a report to the device.
			WriteReport();
			//Read a report from the device.
			ReadReport();
		} 
	}
}

void CUsbhidiocDlg::ReadReport()
{
	CString	ByteToDisplay = &quot;&quot;;
	CString	MessageToDisplay = &quot;&quot;;
	DWORD	Result;

	//Read a report from the device.

	/*API call:ReadFile
	'Returns: the report in InputReport.
	'Requires: a device handle returned by CreateFile
	'(for overlapped I/O, CreateFile must be called with FILE_FLAG_OVERLAPPED),
	'the Input report length in bytes returned by HidP_GetCaps,
	'and an overlapped structure whose hEvent member is set to an event object.
	*/

	Result = ReadFile 
		(ReadHandle, 
		InputReport, 
		Capabilities.InputReportByteLength, 
		&amp;NumberOfBytesRead,
		(LPOVERLAPPED) &amp;HIDOverlapped); 

	DisplayLastError(&quot;ReadFile: &quot;) ;

	/*API call:WaitForSingleObject
	'Used with overlapped ReadFile.
	'Returns when ReadFile has received the requested amount of data or on timeout.
	'Requires an event object created with CreateEvent
	'and a timeout value in milliseconds.
	*/

	Result = WaitForSingleObject 
		(hEventObject, 20000);
	DisplayLastError(&quot;WaitForSingleObject: &quot;) ;

	switch (Result)
	{
	case WAIT_OBJECT_0:
		{
		ValueToDisplay.Format(&quot;%s&quot;, &quot;ReadFile Completed&quot;);
		DisplayData(ValueToDisplay);
		break;
		}
	case WAIT_TIMEOUT:
		{
		ValueToDisplay.Format(&quot;%s&quot;, &quot;ReadFile timeout&quot;);
		DisplayData(ValueToDisplay);
		//Cancel the Read operation.

		/*API call: CancelIo
		Cancels the ReadFile
        Requires the device handle.
        Returns non-zero on success.
		*/

		Result = CancelIo(ReadHandle);

		//A timeout may mean that the device has been removed. 
		//Close the device handles and set DeviceDetected = False 
		//so the next access attempt will search for the device.
		CloseHandle(ReadHandle);
		CloseHandle(DeviceHandle);
		DisplayData(&quot;Can't read from device&quot;);
		DeviceDetected = FALSE;
		break;
	default:
		ValueToDisplay.Format(&quot;%s&quot;, &quot;Undefined error&quot;);
		break;
		}
	}

	/*
	API call: ResetEvent
	Sets the event object to non-signaled.
	Requires a handle to the event object.
	Returns non-zero on success.
	*/

	ResetEvent(hEventObject);

	//Display the report data.
	DisplayInputReport();
}

void CUsbhidiocDlg::WriteReport()
{
	//Send a report to the device.

	//The maximum size of an output report. (This can be increased).
	const unsigned short int	MAXREPORTSIZE = 256;

	DWORD	BytesWritten = 0;
	INT		Index =0;
	CHAR	OutputReport[MAXREPORTSIZE];
	ULONG	Result;
	CString	strBytesWritten = &quot;&quot;;

	//The first byte is the report number.
	OutputReport[0]=0;

	//Can set the other report values here, or get them from the combo boxes.
	//OutputReport[1]=33;
	//OutputReport[2]=6;
	//OutputReport[3]=15;

	//Get the bytes to send from the combo boxes.

	//If Autoincrement is checked, increment the selection.
	if (m_cbutAutoIncrement.GetCheck()&gt;0)
	{
		Index=m_cboByteToSend0.GetCurSel();
		Index=Index+1;
		m_cboByteToSend0.SetCurSel(Index);
	}

	if (m_cbutAutoIncrement.GetCheck()&gt;0)
	{
		Index=m_cboByteToSend1.GetCurSel();
		Index=Index+1;
		m_cboByteToSend1.SetCurSel(Index);
	}

	//Get the values from the combo boxes.
	OutputReport[1]=m_cboByteToSend0.GetCurSel();
	OutputReport[2]=m_cboByteToSend1.GetCurSel();

	/*
	API Function: WriteFile
	Sends a report to the device.
	Returns: success or failure.
	Requires:
	The device handle returned by CreateFile.
	The Output Report length returned by HidP_GetCaps,
	A report to send.
	*/

}
</code></pre>
<p>Den dritten Parameter kann man hier ebenfalls mit einfügen:<br />
Attributes.VersionNumber ...</p>
<p>Viel Glück</p>
]]></description><link>https://www.c-plusplus.net/forum/post/710398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/710398</guid><dc:creator><![CDATA[thenoname]]></dc:creator><pubDate>Sun, 30 Jan 2005 15:40:50 GMT</pubDate></item></channel></rss>