Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DLL

343
22 ноября 2006 года
lena_ki
282 / / 14.04.2005
Впервые в жизни надо написать DLL и сразу, на мой взгляд, довольно сложную. :)
В DLL должна быть функция, которая принимал бы указатель на строку (char *). Далее эта функция обращалась бы к удаленной базе данных, просматривала бы определенную колонку в определенной таблице этой базы данных на сервере и если переданная строка там есть, то возвращала бы ее, а если нет, то возвращала бы NULL.
Подскажите, как такое реализовать?
547
22 ноября 2006 года
Hydra
488 / / 20.06.2006
Придется в dll затолкать компоненты DataBase, DtatSet и т.п. - чтобы запрос сформировать. А внутри процедуры dll - все как и в обычном приложении.
343
22 ноября 2006 года
lena_ki
282 / / 14.04.2005
Цитата: Hydra
Придется в dll затолкать компоненты DataBase, DtatSet и т.п. - чтобы запрос сформировать. А внутри процедуры dll - все как и в обычном приложении.



Значит мне в dll надо добавить модуль данных и на нем все это дело разместить, связать модуль данных с h файлом dll. Внутри процедуры dll искать запись?

547
23 ноября 2006 года
Hydra
488 / / 20.06.2006
Модуль данных-то зачем.
Просто создаешь динамически TDataBase, TTransaction(если надо), TQuery. Поключаешься к БД, открываешь TQuery (или TDataSet) и смотришь результат.
Кста, а в головной программе БД открыта, или к ней только из dll доступ нужен?
343
23 ноября 2006 года
lena_ki
282 / / 14.04.2005
[FONT=Arial][FONT=Verdana]У меня такой вариант вчера заработал. Надежно так?[/FONT] [/FONT]
Код:
//функция в DLL
char * FindRecord(char *param)
{
  CoInitialize(NULL);
  TDataModule1 * DataModule1 = new TDataModule1(Application);
  DataModule1->ADOQuery1->Active = false;
  DataModule1->ADOQuery1->SQL->Clear();
  sprintf(buf, "select code from keys where code = '%s'", param);
  DataModule1->ADOQuery1->SQL->Text = String(buf);
  DataModule1->ADOQuery1->Active = true;
  char *res = NULL;
  char *res2 = NULL;
  if (DataModule1->ADOQuery1->RecordCount == 0)
    ; // ничего не делать
  else {
        res = new char[DataModule1->ADOQuery1->FieldByName("code")->AsString.Length() + 1];
        strcpy(res, DataModule1->ADOQuery1->FieldByName("code")->AsString.c_str());
        res2 = strcpy(buf,res);
        delete res;
       }
    DataModule1->ADOQuery1->Active = false;
    delete DataModule1;
    CoUninitialize(); //это надо?
    return res2;
}

Ошибок нет? :)
501
23 ноября 2006 года
hell_admin
110 / / 02.10.2004
 
Код:
//функция в DLL
  if (DataModule1->ADOQuery1->RecordCount == 0)
    ; // ничего не делать
  else {
        res = new char[DataModule1->ADOQuery1->FieldByName("code")->AsString.Length() + 1];
        strcpy(res, DataModule1->ADOQuery1->FieldByName("code")->AsString.c_str());
        res2 = strcpy(buf,res);
        delete res;
       }

А почему не просто :)
 
Код:
if (DataModule1->ADOQuery1->RecordCount != 0)
  {
        res = new char[DataModule1->ADOQuery1->FieldByName("code")->AsString.Length() + 1];
        strcpy(res, DataModule1->ADOQuery1->FieldByName("code")->AsString.c_str());
        res2 = strcpy(buf,res);
        delete res;
  }


 
Код:
CoUninitialize(); //это надо?

Надо

Да ошибок вроде нет непомню насчет исключений, но если могут возникнуть в ходе выполнения неплохо было бы запихать это все в try/catch
501
23 ноября 2006 года
hell_admin
110 / / 02.10.2004
Только нужно сделать еще один параметр у функции и через него возвращать данные, а функция пускай возвращает результат выполнения например.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог