singlethreading dll -> multithreading dll
От: Димчанский Литва http://dimchansky.github.io/
Дата: 11.04.03 09:11
Оценка:
Есть dll-ка, например, original.dll, которая принимает данные в своем формате и НЕ предназначена для работы в режиме multithreading режиме, только single. Для неё создается wrapper.dll — своя DLL'ка, которая будет конвертировать типы и вызывать соответсвующие функции. Что-то типа:
// wrapper.cpp
#pragma comment(lib,"original.lib")
#include <stdio.h>
#include <windows.h> 
#include "original.h"

BOOL WINAPI DllMain (HANDLE hInst,DWORD dwReason, LPVOID IpReserved) {
    BOOL bAllWentWell=TRUE;
    switch (dwReason) {
        case DLL_PROCESS_ATTACH: // Инициализация процесса.
                  OriginalInitialize(); // это ф-ция инициализации из original.dll
        break; 
        case DLL_THREAD_ATTACH: // Инициализация потока.
        break;
        case DLL_THREAD_DETACH: // Очистка структур потока.
        break;
        case DLL_PROCESS_DETACH: // Очистка структур процесса.
                  OriginalTerminate(); // это ф-ция деинициализации из original.dll
        break;
        }
    if(bAllWentWell) return TRUE;
    else return FALSE;
    }

void __stdcall FuncEstimate1(double* s_in, int s_inN,
                            double* s_out, int s_outN,
                            double* wsp, int* wspN)
{
    OriginalArray* ps_in = NULL;
    OriginalArray* ps_out = NULL;
    OriginalArray* pResult = NULL;

    ps_in = OriginalCreateDoubleMatrix(2, s_inN, OriginalREAL);
    memcpy( OriginalGetPtr(ps_in), s_in, 2*s_inN*sizeof(double) );

    ps_out = OriginalCreateDoubleMatrix(2, s_outN, OriginalREAL);
    memcpy( OriginalGetPtr(ps_out), s_out, 2*s_outN*sizeof(double) );

    //производим вычисления
    pResult = OriginalFunctionEstimate1(ps_in, ps_out);

    //возвращаем результаты
    memcpy( wsp, OriginalGetPtr(pResult), OriginalGetM(pResult)*OriginalGetN(pResult)*sizeof(double) );
    *wspN = OriginalGetN(pResult);
    
    OriginalFreeArray(ps_in);
    OriginalFreeArray(ps_out);
    OriginalFreeArray(pResult);
}

void __stdcall FuncEstimate2(double* s_in, int s_inN,
                            double* s_out, int s_outN,
                            double* wsp, int* wspN)
{
    OriginalArray* ps_in = NULL;
    OriginalArray* ps_out = NULL;
    OriginalArray* pResult = NULL;

    ps_in = OriginalCreateDoubleMatrix(2, s_inN, OriginalREAL);
    memcpy( OriginalGetPtr(ps_in), s_in, 2*s_inN*sizeof(double) );

    ps_out = OriginalCreateDoubleMatrix(2, s_outN, OriginalREAL);
    memcpy( OriginalGetPtr(ps_out), s_out, 2*s_outN*sizeof(double) );

    //производим вычисления
    pResult = OriginalFunctionEstimate2(ps_in, ps_out);

    //возвращаем результаты
    memcpy( wsp, OriginalGetPtr(pResult), OriginalGetM(pResult)*OriginalGetN(pResult)*sizeof(double) );
    *wspN = OriginalGetN(pResult);
    
    OriginalFreeArray(ps_in);
    OriginalFreeArray(ps_out);
    OriginalFreeArray(pResult);
}


Т.е. из программы вызывается FuncEstimate1, FuncEstimate2(из wrapper.dll) -> OriginalFunctionEstimate1, OriginalFunctionEstimate2(из original.dll).
Нужно обеспечить поддержку работы wrapper.dll в режиме multithreading, чтобы из разных потоков можно было вызывать спокойно функции FuncEstimate1, FuncEstimate2, учитывая при этом, что original.dll может работать только в singlethreading режиме. Ну вроде так.
Подскажите, как грамотней поступить.
Спасибо, Дмитрий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.