Builder + Dll = нужена помощь
От: DenisKDA  
Дата: 04.05.05 11:33
Оценка:
Возникла не понятка. Нужна помощь.

Есть у меня DLL в ней есть функция для посылке комманды на COM порт

extern "C"
{
        ....
        __declspec (dllexport) int sendCmd(char *textCMD, char *paramCMD, bool isParam);
        ....
}

_cTIMER *Timer = NULL;
__declspec (dllexport) int sendCmd(char *textCMD, char *paramCMD, bool isParam)
{

DWORD BytesReceived;
DWORD BytesWritten;
char CSend='\0';
PurgeComm(hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(hComm,"\r",1,&BytesWritten,NULL);

Timer = new _cTIMER(5000);
while (!Timer->TimeOUT())
{
ReadFile(hComm,&CSend,1,&BytesReceived,NULL);
if (CSend == '>') break;
}
if (Timer->TimeOUT()){
        delete Timer;
        return -1;
}
else
        delete Timer;

char buffCMD[255];//new char (StrLen(textCMD)+StrLen(paramCMD));
ZeroMemory(&buffCMD,sizeof(buffCMD));

strcpy(buffCMD,textCMD);
strcat(buffCMD,paramCMD);

unsigned len = lstrlen(buffCMD);
for (unsigned int i=0;i<len;i++)
{
CSend = buffCMD[i];
WriteFile(hComm,&CSend,1,&BytesWritten,NULL);

Timer = new _cTIMER(5000);
while (!Timer->TimeOUT()){
 CSend = '\0';
 ReadFile(hComm,&CSend,1,&BytesReceived,NULL);
 if (BytesReceived!=0)
// f << ">> Read char: " << CSend << " | " << IntToHex(CSend,2).c_str()  << endl;
 if (buffCMD[i] == CSend) break;
}

if (Timer->TimeOUT()){
  delete Timer;
  return -1;
}
else
delete Timer;

}
WriteFile(hComm,"\r",1,&BytesWritten,NULL);
delete[] buffCMD;
// ---------------------------------

if (isParam){
//char readStr[512];
//ZeroMemory(&readStr,sizeof(readStr));
//int charcount = 0;
// f << ">> Param present"<< endl;

//strcpy(paramCMD,textCMD);

//strcat(paramCMD," ");

//for (unsigned int i=0;i<(unsigned)lstrlen(paramCMD);i++) *paramCMD++;

for (unsigned int i=0;i<(unsigned)lstrlen(textCMD)-1;i++)
{
*paramCMD = textCMD[i];
*paramCMD++;
}
Timer = new _cTIMER(3000);

while (!Timer->TimeOUT()){
ReadFile(hComm,&CSend,1,&BytesReceived,NULL);

if (BytesReceived!=0) {
*paramCMD = CSend;*paramCMD++;
}
if (CSend == '\r') { break;}
}

if (Timer->TimeOUT()){
        delete Timer;
        return -1;
}
else
        delete Timer;
}
return 0;
}

Смысл фунции такой
Посылает 0х13 в ответ получаем ">" и посимвольно с проверкой посылаем комманду. Комманды бываю двух типов без ответа "go" и с ответом "pl" в ответ "1230 23.5 34". Так же в комманде могут передаваться сами значения "pl 1000".

Теперь в самой программе делую так
в заголовке

private:    // User declarations

       ....
       typedef __declspec (dllexport) int sendCmdType(char *textCMD, char *paramCMD, bool isParam);
       ....

public:        // User declarations
       ....
       sendCmdType* sendCmd;
       ....


в СРР файле

 DrvDll = LoadLibrary("ComPortProject.dll");
  if (DrvDll)
   {
    sendCmd = (sendCmdType*)GetProcAddress(DrvDll,"_sendCmd");
   }


Ну и наконец вызов функции


....
char cmd[256] = {0};
....
sendCmd(CMDID.c_str(),cmd,readData);
...
readData если был true идет обработка параметров cmd.


Загвоздка в следующем, когда я компилю проект в DEBUG все отлично выполняет и работает, как только делаю релиз возникает ошибка "нарушен доступ по адрессу в DLL". В чем дело не пойму. Есть предположения что я не правильно работаю с параметрами функции. Мне не нужно передать два параметра в одном комманда, в другой может быть переменные этой комманды или этот параметер должен вернуть считыные переменные с COM порта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.