Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Ярослав Гость
|
Добавлено: Чт Фев 21 2002 12:50 Заголовок сообщения: C++ Builder и C API MySQL |
|
|
Если кто - то работал с subj'ем, то напишите пожалуйста, как вы это делали, возникали ли при этом проблемы и были ли какие нибудь особенности. Я попытался написать свой класс, но в его функциях постоянно возникают необъяснимые ошибки. |
|
Вернуться к началу |
|
|
Pin
Зарегистрирован: 13.01.2002 Сообщения: 32 Откуда: Magnitogorsk
|
Добавлено: Чт Фев 21 2002 17:46 Заголовок сообщения: Re: C++ Builder и C API MySQL |
|
|
Как это необъяснимые - любой ошибке можно найти объяснение. Все там нормально. Загружаешь libmysql.dll, выцепляешь функции и вперед... |
|
Вернуться к началу |
|
|
Ярослав Гость
|
Добавлено: Пт Фев 22 2002 11:45 Заголовок сообщения: Re: C++ Builder и C API MySQL |
|
|
Ну, это понятно - DLL я загрузил, функцию вызвал, но - коннект идет почти всегда, я получаю в принципе нормально структуру типа MYSQL_RES, а вот достать оттуда данные уже не могу. Ошибку самые разнобразные - беспричинное изменение переменной цикла, ошибка доступа к памяти именно при третьем прохождении цикла получения результатов и т.д. Посылаю кусок кода, может станет понятней Я создал свой класс, но именно при обращении к API из функций класса возникают ошибки.
bool __fastcall TConnection::IsDatabaseExist(AnsiString Database) { bool ExitCode=false; bool Exit; AnsiString S; TStringList *List=new TStringList; const char *Name=Database.c_str(); res=MysqlListdbs(mysql,(char*)NULL); if (res==0) { char *Err=MysqlError(mysql); Application-MessageBox(Err,"Îøèáê&agr.. Exit=false; return Exit; }; rows=MysqlNumRows(res); //const char *buf[1024]; MEM_ROOT buf=res-data-alloc; for (int i=0; iAdd(S); }; /* while(ExitCode==false) { row=MysqlFetchRow(res); if (row==0) break; Name=Database.c_str(); const char *ptr=row[0]; if (ptr==Name) { MysqlFreeResult(res); Exit=true; return Exit; }; S=AnsiString(row[0]); List-Add(S); ExitCode=false; row=NULL; }; */ MysqlFreeResult(res); Exit=false; // delete List; return Exit; } |
|
Вернуться к началу |
|
|
Pin
Зарегистрирован: 13.01.2002 Сообщения: 32 Откуда: Magnitogorsk
|
Добавлено: Пт Фев 22 2002 14:50 Заголовок сообщения: Re: C++ Builder и C API MySQL |
|
|
Хотелось бы поподробнее увидеть как ты загружал DLL и выцеплял функции. Если ты например поставил не тот модификатор вызова функции, то при вызове олбязательно произойдет порча стека с самыми разнообразными последствиями... Важно очень аккуратно выцепить функции!!! |
|
Вернуться к началу |
|
|
Ярослав Гость
|
Добавлено: Сб Фев 23 2002 11:53 Заголовок сообщения: Re: C++ Builder и C API MySQL |
|
|
посылаю объявления функций и их вызов.
Объявление class TBaseMonitor : public TThread { private: HINSTANCE dllInstance; typedef MYSQL* (*TMysqlConnect) (MYSQL *mysql,const char *host,const char *user,const char *passwd); typedef MYSQL_RES* (*TMysqlListdbs)(MYSQL *mysql, const char *wild); typedef int (*TMysqlSelectdb)(MYSQL *mysql, const char *db); typedef int (*TMysqlQuery)(MYSQL *mysql, const char *query); typedef void (*TMysqlClose)(MYSQL *mysql); typedef char* (*TMysqlError)(MYSQL *mysql); typedef void (*TMysqlFreeResult)(MYSQL_RES *result); typedef int (*TMysqlNumRows)(MYSQL_RES *result); typedef MYSQL_ROW (*TMysqlFetchRow)(MYSQL_RES *result); typedef MYSQL_RES* (*TMysqlListTables)(MYSQL *mysql, const char *wild);
TMysqlConnect MysqlConnect; TMysqlSelectdb MysqlSelectdb; TMysqlQuery MysqlQuery; TMysqlClose MysqlClose; TMysqlError MysqlError; TMysqlListdbs MysqlListdbs; TMysqlListTables MysqlListTables; TMysqlFreeResult MysqlFreeResult; TMysqlNumRows MysqlNumRows; TMysqlFetchRow MysqlFetchRow;
Вызов функций в срр-файле //Çàãðóæà&arin.. áèáëèîòåê&oa.. è ïîëó÷àåì ïñåâäîíèì&ucir.. ôóíêöèé AnsiString AddressDLL=GetCurrentDir()+"\\libmySQL.dll"; dllInstance=LoadLibrary(AddressDLL.c_str()); //Ôóíêöèè MysqlConnect=(TMysqlConnect)GetProcAddress(dllInstance,"mysql_connect".. MysqlSelectdb=(TMysqlSelectdb)GetProcAddress(dllInstance,"mysql_select.. MysqlQuery=(TMysqlQuery)GetProcAddress(dllInstance,"mysql_query"); MysqlClose=(TMysqlClose)GetProcAddress(dllInstance,"mysql_close"); MysqlError=(TMysqlError)GetProcAddress(dllInstance,"mysql_error"); MysqlListdbs=(TMysqlListdbs)GetProcAddress(dllInstance,"mysql_list_dbs.. MysqlListTables=(TMysqlListTables)GetProcAddress(dllInstance,"mysql_li.. MysqlFreeResult=(TMysqlFreeResult)GetProcAddress(dllInstance,"mysql_fr.. MysqlNumRows=(TMysqlNumRows)GetProcAddress(dllInstance,"mysql_num_rows.. MysqlFetchRow=(TMysqlFetchRow)GetProcAddress(dllInstance,"mysql_fetch_.. |
|
Вернуться к началу |
|
|
Pin
Зарегистрирован: 13.01.2002 Сообщения: 32 Откуда: Magnitogorsk
|
Добавлено: Сб Фев 23 2002 13:06 Заголовок сообщения: Re: C++ Builder и C API MySQL |
|
|
А в объявлении функции случайно не надо добавить __stdcall? Например typedef MYSQL* __stdcall (*TMysqlConnect) (MYSQL *mysql,const char *host,const char *user,const char *passwd); |
|
Вернуться к началу |
|
|
Ярослав Гость
|
Добавлено: Вс Фев 24 2002 17:18 Заголовок сообщения: Re: C++ Builder и C API MySQL |
|
|
Ты абсолютно прав, я сейчас подставил, скомпилил - ни глюков, ничего. Еще обкатаю, но я думаю, все будет нормально, спасибо тебе.
Ярослав. |
|
Вернуться к началу |
|
|
|