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