Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание и использование DLL, Трудности с запуском программы 
V
    Опции темы
AndreyGers
Дата 29.11.2014, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В Задании имеется образец программы, не знаю как запустить чтобы работал заголовочный файл. Ну или чтоб вообще что-то работало.
Вот сама программа "расчёта уравнение кривой":
Код

#include <windows.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <clocale>
#include <process.h>
#include <fstream>
#include <iostream>

#include "function.h";

#define Pi 3.14159265358979323846
#define SIZE 20

using namespace std;

// Глобальные переменные
double Ro;
double alpha = Pi/3;
int N = SIZE;                        // количество шагов
int A = 2;                        // значение А
int k = 0;                        // флажок
int iB = 0;                        // счетчик буфера
int startN, endFirstN,                // интервалы кол-ва шагов
endSecondN, endN;
double fi, fiMax, fiAdd;
double Buffer[SIZE][3];                // "буфер"

HANDLE hSemaphore;                // cемафор для учета элементов очереди
HANDLE hWriteEvent;                // cобытие

HMODULE  hDll;                // дескриптор DLL
double(*p_x)(double, double);        // для адреса функции p_x из DLL
double(*p_y)(double, double);        // для адреса функции p_y из DLL

hDll = LoadLibrary("function.dll");    // загрузка динамически подключаемой библиотеки

// расчетная формула х, y
void threadResult(int sN, int lN)
{
    double x, y, q;
    q=1/tan(alpha);

    // настраиваем адреса функций
    p_x = (double(*)(double, double))GetProcAddress(hDll, "p_x");
    p_y = (double(*)(double, double))GetProcAddress(hDll, "p_y");

    for (int i = sN; i < lN; i++){
        Ro = A*exp(q*fi);
        x = p_x(Ro, fi);
        y = p_y(Ro, fi);
        // запись результата в "буфер"
        Buffer[iB][0] = fi;
        Buffer[iB][1] = x;
        Buffer[iB][2] = y;
        // увеличение значения fi
        fi = fi + fiAdd;
        iB++;
    }
}
// ф-я печати
void threadPrint(float fi, float x, float y){
    printf("fi = %2.1f \t\t x = %2.1f \t\t y = %2.1f\n", fi, x, y);
}
// ф-я записи в текстовый файл
void createTextFile(){
    ofstream outfile;
    outfile.open("Out.txt");
    for (int i = 0; i < N; i++){
    outfile << Buffer[i][0] << "\t" << Buffer[i][1] << "\t\t" << Buffer[i][2] << endl;
        outfile.clear();
    }
}
// ф-я первого потока
unsigned __stdcall ThreadFunc1(LPVOID lpParam)
{
    WaitForSingleObject(hSemaphore, INFINITE);
    int start;
    int lastN = 1;
    if (k == 0){
        start = startN;
        lastN = endFirstN;
        threadResult(start, lastN);
        k = 1;
    }
    else if (k == 1){
        start = endFirstN;
        lastN = endSecondN;
        threadResult(start, lastN);
        k = 2;
    }
    else {
        start = endSecondN;
        lastN = endN;
        threadResult(start, lastN);
    }
    k++;
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}
// ф-я второго потока
unsigned __stdcall ThreadFunc2(LPVOID lpParam)
{
    WaitForSingleObject(hSemaphore, INFINITE);
    int start;
    int lastN = 1;
    if (k == 0){
        start = startN;
        lastN = endFirstN;
        threadResult(start, lastN);
        k = 1;
    }
    else if (k == 1){
        start = endFirstN;
        lastN = endSecondN;
        threadResult(start, lastN);
        k = 2;
    }
    else {
        start = endSecondN;
        lastN = endN;
        threadResult(start, lastN);
    }
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}
// ф-я третьего потока
unsigned __stdcall ThreadFunc3(LPVOID lpParam)
{
    WaitForSingleObject(hSemaphore, INFINITE);
    int start;
    int lastN = 1;
    if (k == 0){
        start = startN;
        lastN = endFirstN;
        threadResult(start, lastN);
        k = 1;
    }
    else if (k == 1){
        start = endFirstN;
        lastN = endSecondN;
        threadResult(start, lastN);
        k = 2;
    }
    else {
        start = endSecondN;
        lastN = endN;
        threadResult(start, lastN);
    }
    k++;
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}
// ф-я четвертого потока
unsigned __stdcall ThreadPrint(LPVOID lpParam)
{
    WaitForSingleObject(hWriteEvent, INFINITE);

    int i = 0;
    printf("Исходные данные:\n");
    while (i < N){
    double a = Buffer[i][0], b = Buffer[i][1], c = Buffer[i][2];
    threadPrint(a, b, c);            // фу-я печати
    i++;
    }

    createTextFile();                // ф-я записи в файл
    return 0;
}
// ф-я создания процесса. N - кол-во шагов при расчете
void createProcess(int N)
{
    HANDLE hSemaphore, hWriteEvent, hThreads[4];
    unsigned uThreadIDs[4];

    // расчет шага и интервалов
    startN = 0;                    // промежуток [0;endFiestN]
    endFirstN = int(N / 3);            // промежуток [endFiestN;endSecondN]
    endSecondN = 2 * endFirstN;            // промежуток [endFiestN;endN]
    endN = N;                    // конечная точка в интервале
    fi = 0;                    // начальное значение fi
    fiMax = 2 * Pi;                // максимальное значение fi
    fiAdd = fiMax / N;                // увеличение fi при каждом шаге

    hSemaphore = CreateSemaphore(NULL, 1, 3, NULL);

    hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc1, NULL, 0, &uThreadIDs[0]);
    hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc2, NULL, 0, &uThreadIDs[1]);
    hThreads[2] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc3, NULL, 0, &uThreadIDs[2]);
    hThreads[3] = (HANDLE)_beginthreadex(NULL, 0, &ThreadPrint, NULL, 0, &uThreadIDs[3]);

    WaitForMultipleObjects(3, hThreads, TRUE, INFINITE);
    CloseHandle(hSemaphore);
    CloseHandle(hThreads[0]);
    CloseHandle(hThreads[1]);
    CloseHandle(hThreads[2]);

    hWriteEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("WriteEvent"));
    CloseHandle(hThreads[3]);

    // отключаем библиотеку
    FreeLibrary(hDll);

}

int main()
{
    setlocale(LC_CTYPE, "russian");
    createProcess(N);                // вызов ф-ии процесса
    system("pause");
    return 0;
}

А так-же заголовочный файл function.h:
Код

#include <windows.h>
#include <math.h>

// главная функция
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:   // загрузка DLL 
        break;
    case DLL_THREAD_ATTACH:    // создание потока
        break;
    case DLL_THREAD_DETACH:    // завершение потока
        break;
    case DLL_PROCESS_DETACH:   // отключение DLL
        break;
    }

    return TRUE;
}


extern "C" __declspec(dllexport) double p_x(double Ro, double fi){
    return Ro*cos(fi);
}

extern "C" __declspec(dllexport) double p_y(double Ro, double fi){
    return Ro*sin(fi);
}

Помогите пожалуйста с запуском, не знаю как соединить чтобы работало. Файл dll создаётся в папке Debug (второго проекта) ,всего их 2, один консольное приложение, второй библиотека dll. А что дальше делать не знаю.Как запустить заголовочный файл не знаю.


Это сообщение отредактировал(а) AndreyGers - 29.11.2014, 16:33
PM MAIL   Вверх
vol4ek
Дата 29.11.2014, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


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

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



кидайте сюда свой образец в архиве
PM MAIL ICQ   Вверх
AndreyGers
Дата 29.11.2014, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Образец на визуале оказался слишком тяжёлым.
http://webfiles.ru/files/42406674

Это сообщение отредактировал(а) AndreyGers - 29.11.2014, 17:44
PM MAIL   Вверх
vol4ek
Дата 29.11.2014, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


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

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



давно я так не смеялся)))
Код

extern "C" __declspec(dllexport) double p_x(double Ro, double fi){
    return Ro*cos(fi);
}
extern "C" __declspec(dllexport) double p_y(double Ro, double fi){
    return Ro*sin(fi);
}

 smile 
Код

double(*p_x)(double, double);        // для адреса функции p_x из DLL
double(*p_y)(double, double);        // для адреса функции p_y из DLL
hDll = LoadLibrary("function.dll");    // загрузка динамически подключаемой библиотеки

 smile 
 если вы за такую "работу" еще и деньги платили  smile 
 зачем Вам dll, если функция уже написана в function.h?
Код

double p_x(double Ro, double fi)
{
    return Ro*cos(fi);
}

и
Код

double p_y(double Ro, double fi)
{
    return Ro*sin(fi);
}

 smile  smile  smile   человеку, который дал Вам этот код, Dll следует вкрутить в одно место)))

вот сам код консольного приложения (не проверял на ошибки) собрался нормально.
Код


#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <clocale>
#include <process.h>
#include <fstream>
#include <iostream>

#define Pi 3.14159265358979323846
#define SIZE 20

using namespace std;

// Глобальные переменные
double Ro;
double alpha = Pi/3;
int N = SIZE;                        // количество шагов
int A = 2;                        // значение А
int k = 0;                        // флажок
int iB = 0;                        // счетчик буфера
int startN, endFirstN,                // интервалы кол-ва шагов
    endSecondN, endN;
double fi, fiMax, fiAdd;
double Buffer[SIZE][3];                // "буфер"

HANDLE hSemaphore;                // cемафор для учета элементов очереди
HANDLE hWriteEvent;                // cобытие

double p_y(double Ro, double fi)
{
    return Ro*sin(fi);
}
double p_x(double Ro, double fi)
{
    return Ro*cos(fi);
}

// расчетная формула х, y
void threadResult(int sN, int lN)
{
    double x, y, q;
    q=1/tan(alpha);

    // настраиваем адреса функций


    for (int i = sN; i < lN; i++){
        Ro = A*exp(q*fi);
        x = p_x(Ro, fi);
        y = p_y(Ro, fi);
        // запись результата в "буфер"
        Buffer[iB][0] = fi;
        Buffer[iB][1] = x;
        Buffer[iB][2] = y;
        // увеличение значения fi
        fi = fi + fiAdd;
        iB++;
    }
}
// ф-я печати
void threadPrint(float fi, float x, float y){
    printf("fi = %2.1f \t\t x = %2.1f \t\t y = %2.1f\n", fi, x, y);
}
// ф-я записи в текстовый файл
void createTextFile(){
    ofstream outfile;
    outfile.open("Out.txt");
    for (int i = 0; i < N; i++){
        outfile << Buffer[i][0] << "\t" << Buffer[i][1] << "\t\t" << Buffer[i][2] << endl;
        outfile.clear();
    }
}
// ф-я первого потока
unsigned __stdcall ThreadFunc1(LPVOID lpParam)
{
    WaitForSingleObject(hSemaphore, INFINITE);
    int start;
    int lastN = 1;
    if (k == 0){
        start = startN;
        lastN = endFirstN;
        threadResult(start, lastN);
        k = 1;
    }
    else if (k == 1){
        start = endFirstN;
        lastN = endSecondN;
        threadResult(start, lastN);
        k = 2;
    }
    else {
        start = endSecondN;
        lastN = endN;
        threadResult(start, lastN);
    }
    k++;
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}
// ф-я второго потока
unsigned __stdcall ThreadFunc2(LPVOID lpParam)
{
    WaitForSingleObject(hSemaphore, INFINITE);
    int start;
    int lastN = 1;
    if (k == 0){
        start = startN;
        lastN = endFirstN;
        threadResult(start, lastN);
        k = 1;
    }
    else if (k == 1){
        start = endFirstN;
        lastN = endSecondN;
        threadResult(start, lastN);
        k = 2;
    }
    else {
        start = endSecondN;
        lastN = endN;
        threadResult(start, lastN);
    }
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}
// ф-я третьего потока
unsigned __stdcall ThreadFunc3(LPVOID lpParam)
{
    WaitForSingleObject(hSemaphore, INFINITE);
    int start;
    int lastN = 1;
    if (k == 0){
        start = startN;
        lastN = endFirstN;
        threadResult(start, lastN);
        k = 1;
    }
    else if (k == 1){
        start = endFirstN;
        lastN = endSecondN;
        threadResult(start, lastN);
        k = 2;
    }
    else {
        start = endSecondN;
        lastN = endN;
        threadResult(start, lastN);
    }
    k++;
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}
// ф-я четвертого потока
unsigned __stdcall ThreadPrint(LPVOID lpParam)
{
    WaitForSingleObject(hWriteEvent, INFINITE);

    int i = 0;
    printf("Исходные данные:\n");
    while (i < N){
        double a = Buffer[i][0], b = Buffer[i][1], c = Buffer[i][2];
        threadPrint(a, b, c);            // фу-я печати
        i++;
    }

    createTextFile();                // ф-я записи в файл
    return 0;
}
// ф-я создания процесса. N - кол-во шагов при расчете
void createProcess(int N)
{
    HANDLE hSemaphore, hWriteEvent, hThreads[4];
    unsigned uThreadIDs[4];

    // расчет шага и интервалов
    startN = 0;                    // промежуток [0;endFiestN]
    endFirstN = int(N / 3);            // промежуток [endFiestN;endSecondN]
    endSecondN = 2 * endFirstN;            // промежуток [endFiestN;endN]
    endN = N;                    // конечная точка в интервале
    fi = 0;                    // начальное значение fi
    fiMax = 2 * Pi;                // максимальное значение fi
    fiAdd = fiMax / N;                // увеличение fi при каждом шаге

    hSemaphore = CreateSemaphore(NULL, 1, 3, NULL);

    hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc1, NULL, 0, &uThreadIDs[0]);
    hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc2, NULL, 0, &uThreadIDs[1]);
    hThreads[2] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc3, NULL, 0, &uThreadIDs[2]);
    hThreads[3] = (HANDLE)_beginthreadex(NULL, 0, &ThreadPrint, NULL, 0, &uThreadIDs[3]);

    WaitForMultipleObjects(3, hThreads, TRUE, INFINITE);
    CloseHandle(hSemaphore);
    CloseHandle(hThreads[0]);
    CloseHandle(hThreads[1]);
    CloseHandle(hThreads[2]);

    hWriteEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("WriteEvent"));
    CloseHandle(hThreads[3]);



}

int main()
{
    setlocale(LC_CTYPE, "russian");
    createProcess(N);                // вызов ф-ии процесса
    system("pause");
    return 0;
}




сам exe:


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  dll_using.rar 9,87 Kb
PM MAIL ICQ   Вверх
AndreyGers
Дата 29.11.2014, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за внимание smile Нет, денег не платил))
Это просто пример лабы, знакомый скинул чтоб я по примеру лабораторную сдал, меня напрягала библиотека h.
Теперь понимаю что препод который лабу принял не умнее сдавшего.
Я до этого сделал программу по расчёту точек циссоиды, но проблема в том что следующее задание, сделать эту же программу с 
использованием DLL.
У меня отдельно имеется DLL код программы но я не знаю как в него втулить мою функцию, вот и спёр пример чужого графика :(
Как я понял от меня требуется 2 проекта: первый консоль и в нём переменные, второй dll и в нём расчёт.
Если что вот мой пример: (там подставлены левые данные в dll для того чтобы хоть что-то компилировало)
http://webfiles.ru/files/42407220
А ниже txt то что я кодил до этого, т.е. циссоида.


Это сообщение отредактировал(а) AndreyGers - 29.11.2014, 20:04

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Лаба_9.rar 1,20 Kb
PM MAIL   Вверх
vol4ek
Дата 29.11.2014, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


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

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



я только понял, что у Вас большие проблемы с использованием dll.
вот пример создания и использования dll:

создаете консольное приложение, далее ставите флажок "библиотека dll" и пустой проект.
добавляете в проект два файла dll.h и dll.cpp

Код

// dll.h
#include <windows.h>
extern "C" __declspec(dllexport) int Func(int a, int b);  // функция, которая будет экспортироваться


Код

// dll.cpp
#include "dll.h"

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:   // загрузка DLL 
        break;
    case DLL_THREAD_ATTACH:    // создание потока
        break;
    case DLL_THREAD_DETACH:    // завершение потока
        break;
    case DLL_PROCESS_DETACH:   // выгрузка DLL
        break;
    }
    return TRUE;
}

extern "C" __declspec(dllexport) int Func(int a, int b) // функция принимает два числа и возвращает их сумму
{
    return a + b;
}



вызывающая программа:

Код

//exe.h
#include <windows.h>
extern "C" __declspec(dllexport) int Func(int a, int b);



Код

//exe.cpp
#include <stdio.h>
#include "exe.h"

int main (int argc, char * argv[])
{
    typedef int (Function)(int, int);
    Function * f;
    HMODULE hLib = LoadLibrary(L"dll.dll"); // загрузка dll
    if(hLib==NULL)
    {
        printf("ошибка при загрузке dll.dll");
        system("pause");
        return -1;
    }
    else
    {
        f = (Function *)::GetProcAddress(hLib,"Func"); // получение адреса функции в dll
        int a = 3;
        int b = 2;
        printf("%d",f(a,b)); // вызов функции dll
        system("pause");
        ::FreeLibrary(hLib); // выгрузить dll
        return 0;
    }
}

делайте по аналогии и будет Вам щастье. не забудьте, что exe и dll должны находиться в одной папке.
Дядя Модератор, перенеси тему в центр помощи.

Это сообщение отредактировал(а) vol4ek - 29.11.2014, 21:01
PM MAIL ICQ   Вверх
AndreyGers
Дата 30.11.2014, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо Огромное !)
Получилось то, что и было нужно smile
вот если что)))

http://webfiles.ru/files/42408845
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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