UDF на 64битной ОС

Администирование клиентской и серверной части InterBase, Firebird, Yaffil. Настройка файла конфигурации и т.п.

Модераторы: kdv, Alexey Kovyazin

Ответить
nevadimka
Сообщения: 51
Зарегистрирован: 04 мар 2008, 10:33

UDF на 64битной ОС

Сообщение nevadimka » 06 дек 2010, 17:03

Есть исходник который использовали только для Вин32 и Линукс32 и 64.
Счас возникла необходимость сделать и для ВИн64.
Код приблительно такой:

Код: Выделить всё

#if defined(_LP64) || defined(__LP64__) || defined(__arch64__)
typedef int             ISC_LONG;
typedef unsigned int    ISC_ULONG;
#else
typedef signed long     ISC_LONG;
typedef unsigned long   ISC_ULONG;
#endif

typedef struct {
        ISC_LONG  quad_high;
        ISC_ULONG quad_low;
} ISC_QUAD;

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <sys/timeb.h>

#ifdef WIN32
#include <windows.h>
#include <intrinsics.h>
#else
#include <unistd.h>
#endif
#include <time.h>

typedef unsigned long long int64;
int64 starttime[20] = {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
const char * SetLEnglish = "abcdefghijklmnopqrstuvwxyz";
const char * SetLRussian = "aбвгдеёжзийклмопрстуфхцчшщьыъэюяіїє\'";
const char * SetHRussian = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯІЇЄ\'";

const char * SetHEnglish = "ABCDEFGHIJKLMNOPQRSTUVWXYZ'`";

const char * SetDigits = "0123456789";

int64 CPUClock = 2128;
int RisidualTime = 64;
int TimerIsInitialized = 0;

#ifndef WIN32
#define __declspec(x)
#endif

double __declspec(dllexport) fn_ceiling (double* a)
{
    return ceil(*a - 0.00000000001);
}

double __declspec(dllexport) fn_floor (double* a)
{
    return floor(*a + 0.00000000001);
}

#ifdef WIN32
double __declspec(dllexport) fn_round (double* a)
{
    double v;
    if (*a>=0) v=(fmodl(*a,1)<0.499999999) ? floor(*a) : ceil(*a);
        else v=(fmodl(fabsl(*a),1)<0.499999999) ? -floor(fabsl(*a)):-ceil(fabsl(*a));
    return v;
}
#else
double  fn_round (double* a)
{
        double v;
    if (*a>=0) v=(fmod(*a,1)<0.499999999) ? floor(*a) : ceil(*a);
        else v=(fmod(fabs(*a),1)<0.499999999) ? -floor(fabs(*a)):-ceil(fabs(*a));
    return v;
}
#endif

#ifdef WIN32
BOOL WINAPI __declspec(dllexport) LibMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // The DLL is being loaded for the first time by a given process.
            // Perform per-process initialization here.  If the initialization
            // is successful, return TRUE; if unsuccessful, return FALSE.


            break;
        case DLL_PROCESS_DETACH:
            // The DLL is being unloaded by a given process.  Do any
            // per-process clean up here, such as undoing what was done in
            // DLL_PROCESS_ATTACH.  The return value is ignored.


            break;
        case DLL_THREAD_ATTACH:
            // A thread is being created in a process that has already loaded
            // this DLL.  Perform any per-thread initialization here.  The
            // return value is ignored.

            break;
        case DLL_THREAD_DETACH:
            // A thread is exiting cleanly in a process that has already
            // loaded this DLL.  Perform any per-thread clean up here.  The
            // return value is ignored.

            break;
    }
    return TRUE;
}
#endif
Естествено в таком виде не компилилась длл, но если прямо прописать дефайн32, то компилится без ошибок, но ФБ всеравно ругается на entry point.

Буду рад любой помощи, заранее спасибо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя