Hallo Squeakers,
ich möchte aus Squeak auf einen Sensor der Windows 7 Server and Location Platform zugreifen. Die relevanten Klassen für den Zugriff auf die API werden durch die Dateien sensors.h und sensorsapi.h bereitgestellt. Die Sensoren werden in der Api nach verschiedenen Gesichtspunkten eingeteilt und können dediziert angesprochen werden. Für die Kommunikation mit den Sensoren werden von der API COM-Objekte benutzt. In C++ habe ich ein kleines Beispiel Programm geschrieben, um auf den Wert eines Ambient Light Sensors zuzugreifen. Jetzt suche ich nach einer Möglichkeit, entweder direkt aus Squeak die COM Objekte anzusprechen oder die Funkion in eine DLL Datei zu verschieben und dann diese über FFI in squeak einzubinden. Hat jemand schon einmal aus Squeak heraus mit COM-Objekten kommuniziert? Mit freundlichen Grüßen Henning ============================================================================== Hello Squeakers, I will communicate with COM-Objects (Component Object Model) to receive Information about Sensors from the Windows 7 Sensor API. My idea is to write a C++ function, which give me back the sensor data and put this function in a dll file. To use the sensor data in Squeak, I will call this function over the FFI Interface. It's my first project in Squeak. I don't programmed squeak before. I have no idea I can do this. Is it possible to do this? Or can Squeak direct communicate with COM-Objects? To communicate to the Interfaces from the Sensor and Location Platform, I use the sensors.h and sensorsapi.h file. The C++ Code is: void ALSread(double* pSenWert) { ISensorManager* pSensorManager; ISensorCollection* pALSCollection; HRESULT hr; PROPVARIANT SensorData; //double SenWert; //BSTR FriendlyName; ULONG ulCount=0; // 1. Initialize the COM library (make Windows load the DLLs). Normally you would // call this in your InitInstance() or other startup code. In MFC apps, use // AfxOleInit() instead. CoInitialize ( NULL ); // 2. Create a COM object, using the Active Desktop coclass provided by the shell. // The 4th parameter tells COM what interface we want (ISensorManager). //derReferenzwert des Objektes wird auf 1 gesetzt hr = CoCreateInstance(CLSID_SensorManager,NULL,CLSCTX_INPROC_SERVER,IID_ISensorManager,(void**)&pSensorManager); if(hr == HRESULT_FROM_WIN32(ERROR_ACCESS_DISABLED_BY_POLICY)) { // Unable to retrieve sensor manager due to // group policy settings. Alert the user. printf("Error: unable to retrive sensor manager COM object\n"); } else { hr = pSensorManager->GetSensorsByType(SENSOR_TYPE_AMBIENT_LIGHT,&pALSCollection); if (SUCCEEDED(hr)&& NULL != pALSCollection) { printf("Auslesen der Sensorliste erfolgreich!\n"); hr = pALSCollection->GetCount(&ulCount); printf("\nAnzahl der gefundenen Ambient Light Sensoren: %u\n\n",ulCount); //alle Virtual Light Sensoren auslesen for (ULONG i=0; i < ulCount; i++) { ISensor* pSensor; hr = pALSCollection->GetAt(i,&pSensor); if (SUCCEEDED(hr)) { ISensorDataReport* pSensorDataReport; //hr = pSensor->GetFriendlyName(&FriendlyName); //wcout<<FriendlyName<<L'\n'; hr = pSensor->GetData(&pSensorDataReport); hr = pSensorDataReport->GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,&SensorData); //cout << SensorData.vt ; //printf("Sensor Wert : %.2lf \n", (double)SensorData.fltVal); *pSenWert=(double)SensorData.fltVal; //printf("Sensor Wert : %.2lf \n", *pSenWert); pSensor->Release(); pSensorDataReport->Release(); } else { printf("Error: unable to recieve ISensor object\n"); }; } pALSCollection->Release(); //Freigabe des Speichers } else { printf("Error: unable to retrive Sensor List or no Ambient Light Sensors\n"); }; pSensorManager->Release(); //erniedrigt den Referenzwert des ISensorManager Objektes um 1 und //wenn dieser 0 ist Wird der allokierte Speicherplatz wieder freigegeben }; } Thanks Henning -- Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir belohnen Sie mit bis zu 50,- Euro! https://freundschaftswerbung.gmx.de |
Free forum by Nabble | Edit this page |