Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> неработает в dll функции WinAPI 
V
    Опции темы
kopo4e
Дата 25.8.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Доброго времени суток!
Такая проблемка, необходимо из dll возвращать количество файлов(число) из определенной директории(передаю как параметр функции), для этого использую WinAPI, код на С, скомпилированый  ехе работает нормально, но вот код в dll неработает(компилится все без ошибок) :(, подскажите в чем же может быть проблемма, може необходимо знать какие то тонкости при использовании WinAPI в dll?
PM MAIL   Вверх
Sartorius
Дата 25.8.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



Нет никаких тонкостей. Показывай исходник
PM MAIL ICQ   Вверх
kopo4e
Дата 25.8.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Код

#ifdef WIN32COMMON
__declspec(dllexport)
#endif
int GetFileList222(_path)
char* _path;
{

    WIN32_FIND_DATA *fd;

  HANDLE fh;
  int    attrib_a=0;
  int    filecnt=0;

  char     path[MAX_PATH];
  char     tmppath[MAX_PATH];

  fd = malloc(sizeof(WIN32_FIND_DATA));

  fixpath(_path,path);
  strcat(path,"\\*");

  fh = FindFirstFile((LPCSTR) path,fd);
  if(fh != INVALID_HANDLE_VALUE)
  {
  //в цикл даже незаходит
    do
    {
     if( fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
      {
            //
      }
      else
      {
        char *ch = fd->cFileName;
        char fpath[MAX_PATH];
        char *filetype;

        strcpy(fpath,_path);
        strcat(fpath,ch);

    if ((ch[strlen(ch)-3] == 'x') || (ch[strlen(ch)-3] == 'X') ||
            (ch[strlen(ch)-3] == 'r') || (ch[strlen(ch)-3] == 'R'))
        {
            filecnt++;
            filetype = "тип 1";
            attrib_a++;
        }
        .....
    else if ((ch[strlen(ch)-3] == 'i') || (ch[strlen(ch)-3] == 'I') ||
            (ch[strlen(ch)-3] == 'q') || (ch[strlen(ch)-3] == 'Q'))
        {
            filecnt++;
            filetype = "тип 6";
            attrib_a++;
        }
    else
        {
            filetype = "тип неопределен";
        }
      }
    }
    while(FindNextFile(fh,fd));
  }

  FindClose(fh);
   attrib_a =(int) filecnt;
  return ((int)attrib_a);
}

PM MAIL   Вверх
Sartorius
Дата 25.8.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 1
Всего: 37



А как она "не работает"-то? Что возвращает?

ГЫ давно не видел такого синтаксиса типов параметров  smile зачет компиляторам, что такое еще парсят..
PM MAIL ICQ   Вверх
W4FhLF
Дата 25.8.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



 smile 

Код

    if ((ch[strlen(ch)-3] == 'x') || (ch[strlen(ch)-3] == 'X') ||
            (ch[strlen(ch)-3] == 'r') || (ch[strlen(ch)-3] == 'R'))
        {
            filecnt++;
            filetype = "тип 1";
            attrib_a++;
        }
        .....
    else if ((ch[strlen(ch)-3] == 'i') || (ch[strlen(ch)-3] == 'I') ||
            (ch[strlen(ch)-3] == 'q') || (ch[strlen(ch)-3] == 'Q'))
        {
            filecnt++;
            filetype = "тип 6";
            attrib_a++;
        }


На дух не переношу подобные конструкции. Почему бы не написать:

Код

    char с = ch[strlen(ch)-3] | 0x20;
    if ((c == 'x') || (c == 'r'))
        {
            filecnt++;
            filetype = "тип 1";
            attrib_a++;
        }
        .....
    else if ((c == 'i') || (c == 'q'))
        {
            filecnt++;
            filetype = "тип 6";
            attrib_a++;
        }


Это сообщение отредактировал(а) W4FhLF - 25.8.2008, 15:36


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
kopo4e
Дата 25.8.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



что самое итрересное у меня 2 разновидности такой функции у ондой хандл вовращает -1(код показан выше), а вот 2 вторая каждый раз возвращает новое число, как я понимаю хендл.может подчитать 1 файл и все (дальше считать нехочет)!
мне просто необходимо подсчитывать определенные файлы у которых стоит в расшерении определенные буковки smile

Код второй разновидности функции:
Код

#ifdef WIN32COMMON
__declspec(dllexport)
#endif
int GetFileList(dirfile)
char* dirfile;
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;

   char DirSpec[MAX_PATH];  
   char DirFile[MAX_PATH];

   DWORD dwError;
   int count = 0;
   char* filetype;

    strncpy (DirSpec, dirfile, strlen(dirfile)+1);
    strncpy (DirFile, dirfile, strlen(dirfile)+1);//путь к файлу
    strncat (DirSpec, "\\*", 3);

   hFind = FindFirstFile(DirSpec, &FindFileData);
//----------------------------------------------------------------------------------------------
    //это условие отрабатыват, в этот иф происходит заход
    if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FindFileData.cFileName,"..") && strcmp(FindFileData.cFileName,"."))
    {//********1

        char *ch = FindFileData.cFileName;
        char fpath[MAX_PATH];

        strcpy(fpath,DirFile);
        strcat(fpath,ch);

    if ((ch[strlen(ch)-3] == 'x') || (ch[strlen(ch)-3] == 'X') ||
            (ch[strlen(ch)-3] == 'r') || (ch[strlen(ch)-3] == 'R'))
        {
            filetype = "тип 1";
            count++;
        }
    .....
    else if ((ch[strlen(ch)-3] == 'i') || (ch[strlen(ch)-3] == 'I') ||
            (ch[strlen(ch)-3] == 'q') || (ch[strlen(ch)-3] == 'Q'))
        {
            filetype = "тип 6";
            count++;
        }
    else
        {
            filetype = "тип неопределен";
        }
        
    }//***********1

    //в цикл заход происходит
    while (FindNextFile(hFind, &FindFileData) != (int)0)
      {//2
    //в это условие вход непроисходит
    if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(FindFileData.cFileName,"..") && strcmp(FindFileData.cFileName,"."))
        {//*************3

        char *ch = FindFileData.cFileName;
        char fpath[MAX_PATH];

        strcpy(fpath,DirFile);
        strcat(fpath,ch);

    if ((ch[strlen(ch)-3] == 'x') || (ch[strlen(ch)-3] == 'X') ||
            (ch[strlen(ch)-3] == 'r') || (ch[strlen(ch)-3] == 'R'))
        {
            filetype = "тип 1";
            count++;
        }
    .....
    else if ((ch[strlen(ch)-3] == 'i') || (ch[strlen(ch)-3] == 'I') ||
            (ch[strlen(ch)-3] == 'q') || (ch[strlen(ch)-3] == 'Q'))
        {
            filetype = "тип 6";
            count++;
        }
    else
        {
            filetype = "тип неопределен";
        }
        }//**************3
      }//2
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES)
      {
         return ((int)-1);
      }
//----------------------------------------------------------------------------------------------
}
  return (return_int);
}

PM MAIL   Вверх
kopo4e
Дата 25.8.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Мне тоже такое не по духу, но что делать если VC6 выдает ошибки когда исправляешь на
Код

....
char с = ch[strlen(ch)-3] | 0x20;
    if ((c == 'x') || (c == 'r'))
....

extern1.c(324) : error C2018: unknown character '0xf1'
extern1.c(324) : error C2143: syntax error : missing ';' before 'type'
extern1.c(328) : error C2065: 'c' : undeclared identifier
extern1.c(402) : error C2018: unknown character '0xf1'
extern1.c(402) : error C2143: syntax error : missing ';' before 'type'

что предлагаешь сделать?  smile 
PM MAIL   Вверх
W4FhLF
Дата 25.8.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



kopo4e, разделить объявление переменной и её инициализацию. Заменить русский символ "эс" на английский "c". 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
kopo4e
Дата 25.8.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



smile  
smile 
smile 

нет слов!!!
PM MAIL   Вверх
Dem_max
Дата 25.8.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Что за запись такая интересная ? 
Цитата

int GetFileList222(_path)
char* _path;


может лучше так :
Цитата

int GetFileList222(char  *_path)
{
......
}



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
andrew_121
Дата 25.8.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



Dem_max, Ооо... Это раритетная запись smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kopo4e
Дата 26.8.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



народ больше нет никаких мыслей, идей, почему неработает WINAPI в dll? smile 
может компилировать в другой среде?
PM MAIL   Вверх
W4FhLF
Дата 26.8.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Выложи проект exe файла, который вызывает функцию из dll и саму dll в готовом виде. Только убери из исходников всё лишнее.  


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
kopo4e
Дата 26.8.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Я вызываю dll из оракла, dll у меня служит внешней процедурой! щас выложу. тлько лишнее уберу.

Добавлено через 9 минут и 57 секунд
Выкладываю dll, оракл выложить немогу, трафик непозволяет! smile

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  extern1_1.zip 2,29 Kb
PM MAIL   Вверх
EnergoHokum
Дата 26.8.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 600
Регистрация: 10.11.2006
Где: Россия, Ставропол ь

Репутация: 3
Всего: 6



Меня смущает вот это: strcat(path,"\\*");
По идее, эта функция должна объединять две строки, первую она находит по символу \0, но, т. к. массив path у тебя не инициализирован, то в нём может лежать любой мусор, и этот \0 может находиться чёрт-те где. Разумеется, в таком случае ни о каком корректном имени пути речи быть не может. Попробуй сделать strcpy(&path[0],"\\*");
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.