Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает ReadFile() при подключении своей библиотеки (C++)

440
04 апреля 2011 года
[FENIX]
83 / / 29.01.2007
Вот исходник:

файл My_Dll.h

Код:
// My_Dll.h


/*
#ifndef MYLIBAPI
    #define MYLIBAPI __declspec(dllimport)
#endif

*/

#include "stdafx.h"
#include "stdio.h"
#include<iostream>
#include <cmath>


#include <fcntl.h>
#include <Windows.h>
#include <tchar.h>


using namespace std;


namespace My_Dll
{
    struct Node
    {
        int value;  //значение узла
        Node * left;        //левая ветвь
        Node * right;       //правая ветвь
   
        //Конструктор структуры
        Node() {
            left = right = NULL;
        }

        Node(int x)
        {
            value=x;
            left = right = NULL;
        }

    };

    class MyTree
    {
    public:
       
        //сюда надо добавить сигнатуры всех методов из лаб 4 и 5

        static __declspec(dllexport) Node* createTree(int count);
        static __declspec(dllexport) Node* makeTree(Node* pointer, int x);
        static __declspec(dllexport) Node* Create_Dihotomy(Node *pointer, int k);
        static __declspec(dllexport) void LKP(Node* pointer);
        static __declspec(dllexport) void Print_Tree (Node *pointer,int l);
        static __declspec(dllexport) int Max(int first, int second);
        static __declspec(dllexport) int Height (Node *pointer);
        static __declspec(dllexport) void IsBalancedTree(Node* pointer);
        static __declspec(dllexport) int ascii_cod(char x);
        static __declspec(dllexport) Node* AddNode(Node * pointer, char val);
        static __declspec(dllexport) Node * CreateBalancedTree(char * fname, Node* pointer);

    };
}



Файл TreeFuncs.cpp

Код:
// compile with: /EHsc /LD
#define MYLIBAPI    __declspec(dllexport)



#include "My_Dll.h"
#include <stdexcept>

#include "stdafx.h"
#include "stdio.h"
#include<iostream>
#include <cmath>
#include <fcntl.h>
#include <Windows.h>
#include <tchar.h>

using namespace std;


namespace My_Dll
{

...
Node * MyTree:: CreateBalancedTree(char * fname, Node* pointer)
    {
        //HANDLE fp = CreateFile (fname, GENERIC_WRITE && GENERIC_READ, 0, NULL, CREATE_NEW, 0, NULL);

        //HANDLE fp = CreateFile((LPCWSTR)fname,GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL);
        HANDLE fp = CreateFile((LPCTSTR)fname,GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL);
        //HANDLE fp = CreateFile(fname,GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL);

        char Bufer[20];

        DWORD dwRead=0;
        ReadFile(fp, Bufer, sizeof(Bufer), &dwRead, NULL);
   
   

        DWORD err=GetLastError();
   
        LPTSTR s;

        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (LPTSTR)&s, 0, NULL);

        int i=0;
        while(  ascii_cod(Bufer) > 0 )
            i++;
   
        int count=i;

        i=0;

        while(i<count)
        {
            pointer=AddNode(pointer,Bufer);
            i++;
        }


        CloseHandle(fp);

    return pointer;

    }
....

}


файл MyExecTreeDll.cpp

Код:
// MyExecTreeDll.cpp : Defines the entry point for the console application.
//compile with: /EHsc /link MathFuncsDll.lib

//#pragma comment(linker, "My_Dll.lib")




#include "stdafx.h"
#include <iostream>
#include <Windows.h>

#include "My_Dll.h"
using namespace std;

struct Node
    {
        int value;  //значение узла
        Node * left;        //левая ветвь
        Node * right;       //правая ветвь
   
        //Конструктор структуры
        Node() {
            left = right = NULL;
        }

        Node(int x)
        {
            value=x;
            left = right = NULL;
        }

    };

void _tmain(int argc, _TCHAR* argv[])
{
...
int h;//высота дерева

My_Dll::Node* root=NULL;//Корень дерева
   
   
    //--------------------ниже код не работает
    root= My_Dll::MyTree::CreateBalancedTree("Tree.txt",root);
...
}




Метод ReadFile из TreeFuncs.cpp ничего не записывает в массив Bufer[20].
Подскажите пожалуйста, где у меня ошибка. Остальные методы работают нормально.
Пробовал делать без библиотек, всё работает нормально, а вот с подключением библиотеки этот метод пока не работает ((.
278
04 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Какой код ошибки возвращается?
Бегло просмотрел ваш код, могу предложить открывать файл с маской FILE_SHARE_READ. Код из DLL запускается ведь в адресном пространстве каждого процесса.
440
04 апреля 2011 года
[FENIX]
83 / / 29.01.2007
GetLastError() возвращает 183 "Невозможно создать файл, т.к. он уже существует", но это нормально, файл то у меня действительно есть.

Пробовал использовать HANDLE fp = CreateFile((LPCTSTR)fname,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL); но не помогло
278
04 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Ну 183 не есть ошибка.
[QUOTE=MSDN]
If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
[/QUOTE]
А вы проверяли, что после CreateFile() возвращается валидный дескриптор?
440
04 апреля 2011 года
[FENIX]
83 / / 29.01.2007
Так у меня же HANDLE fp = CreateFile((LPCTSTR)fname,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL);

4 параметр NULL, я не знаю, какой именно параметр надо подставить, а на сайте Microsoft вообще написано:

CreateFile ignores the lpSecurityDescriptor member when opening an existing file or device, but continues to use the bInheritHandle member.

Я теперь вообще не знаю что делать
278
04 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Четвертый параметр и должен быть NULL, там все правильно. Я имею в виду, вы уверены, что fp != INVALID_HANDLE_VALUE?
278
05 апреля 2011 года
Alexander92
1.1K / / 04.08.2008
Тему можно закрывать, она была благополучно разрешена в личной беседе. Проблема - в кодировках.
440
05 апреля 2011 года
[FENIX]
83 / / 29.01.2007
Проблема решена, спасибо Alexander92. Тему можно закрывать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог