По данному примеру пытаюсь сделать свой CIN_init. Код практически такой же, но снова появляется ошибка на этом методе (WGetModuleName).
Проект компилируется без проблем (Visual Studio 2003 .NET). init.lsb создается. Ошибка появляется при запуске в LV 7.1. Предъявляю код. Может я что неправильно делаю?
/* CIN source file */
#include <windows.h>
#include "extcode.h"
#include "E440str.h"
#include "E440vi.h"
#include "stdio.h"
MgErr CINRun(uInt32 *hDll, uInt32 *hIfc, uInt8 *ushortSlot,
uInt16 *uintError, LStrHandle strError);
MgErr CINRun(uInt32 *hDll, uInt32 *hIfc, uInt8 *ushortSlot,
uInt16 *uintError, LStrHandle strError)
{
char str[20],strName[20],dllName[20];
unsigned char slot;
MODULE_DESCR_E440 md;
FILE *stream;
ADC_PARS_E440 am;
int i;
stream = fopen("log.txt","w+");
strcpy(dllName,"lusbapi.dll");
LoadAPIDLL(dllName,hDll);
if (*hDll==0)
{
strcpy(str,"Не загружена библиотека!");
*uintError = 1;
goto end;
}
else
{
fprintf(stream,"Библиотека загружена/n");
}
*hIfc = CallCreateInstance(*hDll,"E440");
if (*hIfc==0)
{
strcpy(str,"Не получена ссылка на объект");
*uintError = 1;
FreeAPIDLL(*hDll);
goto end;
}else fprintf(stream,"Ссылка на объект получена/n");
for (slot=0;slot<8;slot++)
if (WInitLDevice(*hIfc, *ushortSlot)) break;
/*
{
strcpy(str,"Устройство не проинициализировано");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Устройство проинициализировано");
*/
if (slot==8)
{
strcpy(str,"Не найдено ни одного подключения платы E14-440");
*uintError = 1;
goto end_all;
}
else
{
*ushortSlot = slot;
fprintf(stream,"Плата установлена в слоте %i/n",slot);
}
if (!WGetModuleName(*hIfc,strName))
{
strcpy(str,"Не удалось получить имя устройства");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Имя устройства - %s/n",strName);
if (!strcmp(strName,"E440"))
{
strcpy(str,"В данный слот установлена не плата E14-440");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Подтверждение установки платы/n");
if (!WLOAD_LBIOS(*hIfc,NULL))
{
strcpy(str,"Не удается загрузить BIOS");
*uintError = 1;
goto end_all;
}else fprintf(stream,"BIOS загружен/n");
if (!WMODULE_TEST(*hIfc))
{
strcpy(str,"Плата не прошла тестирование");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Плата прошда тестирование/n");
md.size = sizeof(MODULE_DESCR_E440);
if (!WGET_MODULE_DESCR(*hIfc,&md))
{
strcpy(str,"Служебная информация из ППЗУ не считана");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Служебная информация из ППЗУ считана/n");
fprintf(stream,"----- Module description information -------/n");
fprintf(stream,"Serial number - %s/n",md.SerialNumber);
fprintf(stream,"DSP type - %s/n",md.Dsp_Type);
fprintf(stream,"DAC presenetd - %c/n",md.IsDacPresented);
fprintf(stream,"Name - %s/n",md.Name);
fprintf(stream,"Quarz frequency - %l/n",md.QuartzFrequency);
fprintf(stream,"Revision - %c/n",md.Revision);
fprintf(stream,"Size - %u/n",md.size);
fprintf(stream,"Calibrate koefficients:/n");
for (i=0;i<8;i++)
fprintf(stream,"Koef[%i] - %u/n",i,md.CalibrKoefAdc[i]);
am.InputMode = 0;
am.CorrectionEnabled = 1;
for (i=0;i<8;i++) am.CalibrKoefAdc[i] = md.CalibrKoefAdc[i];
am.ChannelsQuantity = 4;
am.ControlTable[0] = 0x30;//00100000;
am.ControlTable[1] = 0x31;
am.ControlTable[1] = 0x32;
am.ControlTable[1] = 0x33;
am.AdcRate = 400;
am.InterKadrDelay = 0;
am.AdcFifoLength = 0x3000;
am.size = sizeof(ADC_PARS_E440);
if (!WFILL_ADC_PARS(*hIfc,&am))
{
strcpy(str,"Параметры АЦП не установлены");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Установлены новые параметры АЦП/n");
am.size = sizeof(ADC_PARS_E440);
if (!WGET_CUR_ADC_PARS(*hIfc, &am))
{
strcpy(str,"Не получены текущие данные о работе АЦП");
*uintError = 1;
goto end_all;
}else fprintf(stream,"Получены установленные парамтры АЦП/n");
fprintf(stream,"----- Current ADC parameters ------/n");
fprintf(stream,"ADC enabled - %i/n",(int)am.AdcEnabled);
fprintf(stream,"ADC fifo base address - %u/n",am.AdcFifoBaseAddress);
fprintf(stream,"ADC fifo lenght - %u/n",am.AdcFifoLength);
fprintf(stream,"ADC rate - %lf/n",am.AdcRate);
fprintf(stream,"Calibrate koefficients:/n");
for (i=0;i<8;i++)
fprintf(stream,"Koef[%i] - %u/n",i,am.CalibrKoefAdc[i]);
fprintf(stream,"Channel rate - %lf/n",am.ChannelRate);
fprintf(stream,"Channels quantity - %u/n",am.ChannelsQuantity);
fprintf(stream,"Correction enableed - %i/n",(int)am.CorrectionEnabled);
fprintf(stream,"Input mode - %u/n",am.InputMode);
fprintf(stream,"Inter frame delay - %lf/n",am.InterKadrDelay);
fprintf(stream,"Size - %u/n",am.size);
fprintf(stream,"Synchro ADC channel - %u/n",am.SynchroAdChannel);
fprintf(stream,"Synchro ADC mode - %u/n",am.SynchroAdMode);
fprintf(stream,"Synchro ADC porog - %i/n",(int)am.SynchroAdPorog);
fprintf(stream,"Synchro ADC type - %u/n",am.SynchroAdType);
end_all:
//if (*uintError == 1)
{
//CancelIo(WGetModuleHandle(*hIfc));
WReleaseLDevice(*hIfc);
FreeAPIDLL(*hDll);
}
end:
NumericArrayResize(uB, 1L,(UHandle*)&strError,60);
strcpy(LStrBuf(*strError),str);
LStrLen(*strError) = 60;
fprintf(stream,"Error - %s/n",str);
fclose(stream);
return noErr;
}
Еще вопрос. Если несложно, скажите, пожалуйста, откуда берете функцию NumericArrayResize.
Еще... В последне вашем примере для LV в файле E440vi.h вы пишете:
#define DllExport(type) //extern "C" __declspec( dllexport ) type
А раньше было:
#define DllExport(type) extern "C" __declspec( dllexport ) type
А появляется в LV ошибка: Вызов неверно декларированной функции (Наверное, "C" или "C++").
Вот такая в общем проблема.
Если декларировать функцию "C" как показано ранее, то это вызывает ошибку компилятора.
Как это разрешается?