// 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);
};
}
Не работает ReadFile() при подключении своей библиотеки (C++)
файл My_Dll.h
Код:
Файл 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;
}
....
}
#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);
...
}
//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].
Подскажите пожалуйста, где у меня ошибка. Остальные методы работают нормально.
Пробовал делать без библиотек, всё работает нормально, а вот с подключением библиотеки этот метод пока не работает ((.
Бегло просмотрел ваш код, могу предложить открывать файл с маской FILE_SHARE_READ. Код из DLL запускается ведь в адресном пространстве каждого процесса.
Пробовал использовать HANDLE fp = CreateFile((LPCTSTR)fname,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL); но не помогло
[QUOTE=MSDN]
If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
[/QUOTE]
А вы проверяли, что после CreateFile() возвращается валидный дескриптор?
4 параметр NULL, я не знаю, какой именно параметр надо подставить, а на сайте Microsoft вообще написано:
CreateFile ignores the lpSecurityDescriptor member when opening an existing file or device, but continues to use the bInheritHandle member.
Я теперь вообще не знаю что делать
Четвертый параметр и должен быть NULL, там все правильно. Я имею в виду, вы уверены, что fp != INVALID_HANDLE_VALUE?
Тему можно закрывать, она была благополучно разрешена в личной беседе. Проблема - в кодировках.
Проблема решена, спасибо Alexander92. Тему можно закрывать.