//функция в 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;
}
DLL
В DLL должна быть функция, которая принимал бы указатель на строку (char *). Далее эта функция обращалась бы к удаленной базе данных, просматривала бы определенную колонку в определенной таблице этой базы данных на сервере и если переданная строка там есть, то возвращала бы ее, а если нет, то возвращала бы NULL.
Подскажите, как такое реализовать?
Придется в dll затолкать компоненты DataBase, DtatSet и т.п. - чтобы запрос сформировать. А внутри процедуры dll - все как и в обычном приложении.
Цитата: Hydra
Придется в dll затолкать компоненты DataBase, DtatSet и т.п. - чтобы запрос сформировать. А внутри процедуры dll - все как и в обычном приложении.
Значит мне в dll надо добавить модуль данных и на нем все это дело разместить, связать модуль данных с h файлом dll. Внутри процедуры dll искать запись?
Просто создаешь динамически TDataBase, TTransaction(если надо), TQuery. Поключаешься к БД, открываешь TQuery (или TDataSet) и смотришь результат.
Кста, а в головной программе БД открыта, или к ней только из dll доступ нужен?
[FONT=Arial][FONT=Verdana]У меня такой вариант вчера заработал. Надежно так?[/FONT] [/FONT]
Код:
//функция в 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)
; // ничего не делать
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;
}
{
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
Только нужно сделать еще один параметр у функции и через него возвращать данные, а функция пускай возвращает результат выполнения например.