Hej ! : ) Jasne, postaram się odpowiedzieć na pytanie.
vlt, to argument do funkcji, o których mówiłem wcześniej właśnie w tamtym poście. To w nawiasach to wartości, pisałem kropki, bo nie chce mi się pisać 18tu liczb ; ). Po małych zmianach, nazwijmy to labv_plug.DLL:
Kod: Zaznacz cały
ODev* odev_1; // used for pointer to output device
ODev* odev_2; // used for pointer to manual feed device
CDev* cdev; // pointer to controller device
PLUGLABVIEW_API bool readDmc(const char* fileName) // read *dmc file
and initialize devices
{
bool ret = false;
auto_ptr<OKODmcData> newdata;
try { // critical stuff, just exit if it throws
newdata = auto_ptr<OKODmcData>(new OKODmcData(string(fileName)));
odev_1 = newdata->createOutput();
ret = true; }
catch(...) {
odev_1 = NULL;
return(ret); }
try { // noncritical stuff, forget about it if it throws
cdev = newdata->createControl(); // throws if no control data available
odev_2 = new ODFeed(newdata->nControlModes());
cdev -> attachOutput(odev_1);
cdev -> attachMeter(odev_2); }
catch(...) {}
return(ret);
};
PLUGLABVIEW_API void setVoltages(const double* vlt) // apply voltages
to the output device. length of vlt array is supposed to be >=
device1->signalLength()
{
if(odev_1){
odev_1-> set(vlt); }
};
PLUGLABVIEW_API void dmcFree()
{
delete cdev;
delete odev_2;
delete odev_1;
cdev = NULL;
odev_2 = NULL;
odev_1 = NULL;
}
PLUGLABVIEW_API void setZernike(const double* zer) // set zernike
modes amplitudes. length of zer array is supposed to be >=
device2->signalLength()
{
if(odev_2 && cdev){ // just to ensure devices are properly initialized
odev_2->set(zer); // set amplitudes to manual control device
cdev->sweep(); } // run one control cycle (read device2, calculate
output signal, apply it to device1)
};
PLUGLABVIEW_API int nChannels()
{
int ret = 0;
if(odev_1)
ret = odev_1->signalLength();
return(ret);
}
PLUGLABVIEW_API int nModes()
{
int ret = 0;
if(odev_2){
ret = odev_2 -> signalLength();}
return(ret);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
/* Init Code here */
break;
case DLL_THREAD_ATTACH:
/* Thread-specific init code here */
break;
case DLL_THREAD_DETACH:
/* Thread-specific cleanup code here.
*/
break;
case DLL_PROCESS_DETACH:
/* Cleanup code here */
break;
}
/* The return value is used for successful DLL_PROCESS_ATTACH */
return TRUE;
}
Błędy ze wskaźnikami błędami, ale testowy exek działa z tym DLL... Teraz ja tworzę sobie inne DLL, które używa labv_plug.DLL. Dlaczego ? Dlatego, że jak tworzę, tak jak radził oczekp kilka DLL node'ów, korzystających z funkcji labv_plug.DLL, łączę je łańcuchami - urządzenie nie reaguje, funkcja readDmc nie czyta pliku itd. Powinno - ale nie działa. (Testowy exe działa). Dlatego wpadłem na pomysł, że jak jest kilka DLL i utworzę obiekty w jednym z nodeów, to przechodząc do drugiego, ten DLL jest zamykany i tym samym tracone są obiekty. Dlatego próbowałem napisać jeden DLL z funkcją LV_setVoltages(nazwa pliku, array vlt); żeby mieć jedną DLL node. Z wiadomym skutkiem.
Aczkolwiek na forums ni jakiś gość napisał, że DLL nie undloaduje się do zamknięcia VI, więc możemy śmiało wrócić do metody kilku DLL node'ów i nie korzystać z dwóch DLL, tylko z jednej...
Po podłączeniu wiesza się całe środowisko LV. Nie da się nawet zakończyć zadania. Czip FTDI245R jest po stronie urządzenia, jak wiadomo to interfejs USB. Sterowniki na pewno zainstalowałem dobrze. Wyszukałem całą instrukcję jak to zrobić ; )
ALE ! Dzisiaj np. nie wiesza się. Tym urządzenie nie reaguje. Podejrzewam, że typ argumentów metodą prób i błędów, DLLce przestały się zgadzać argumenty i nic nie przekazuje do funkcji, ale zostawmy to, bo to nie ma znaczenie. Urządzenie nie reaguje.
Kiepsko ! : D Dzięki za chęci : ) Mam nadzieję, że ogarniemy....
D.