Шустрый

Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005
Репутация: нет Всего: нет
|
Есть DLL под названием DLLIntegr, разработанная в Visual Studio 2008 как консольное приложение, помеченное как DLL. Есть консольное приложение CallDLLIntegr, которая вызывает эту DLL и которая также была разработана в Visual Studio 2008. И DLL, и консольное приложение компилируются нормально, но в отладчике программа "бьётся". Вот код: 1) файл CallDLLIntegr.cpp : / Код | / CallDLLIntegr.cpp: определяет точку входа для консольного приложения. /* // для неявного подключения #ifdef _DEBUG #pragma comment(lib,"DLLIntegrdbg.lib") #else #pragma comment(lib,"DLLIntegrrel.lib") #endif */ #include <math.h> #include <stdio.h> #include <io.h> #include <conio.h> #include <stdlib.h> #include <string.h> #include <process.h> #include <tchar.h> #include <math.h> #include <windows.h> #include <locale.h> #include <vector> #include <list> #include <string> #include <iostream> //#include <sys/mman.h> #include <sys/types.h> //#include <unistd.h> #include <fcntl.h> #include <WinNT.h> #include <WinBase.h> #include <Windows.h> #include "stdafx.h" #include "DLLIntegr.h" #include "CallDLLIntegr.h"
#ifndef WIN32 static void* hMapping=NULL; static int hFile=-1; #else static HANDLE hMapping=0; static HANDLE hFile=INVALID_HANDLE_VALUE; #endif
// для явного подключения #ifdef _DEBUG const char* const dll_name = "DLLIntegrdbg.dll"; #else const char* const dll_name = "DLLIntegrrel.dll"; #endif
using namespace std;
Eph myTph; //extern Eph Tph;
ISatellite* isat=NULL; //extern Satellite* sat = NULL; //extern int NewSatellite(Satellite* sat); //extern "C" DLLINTEGR_API Eph getTph(); //extern "C" DLLINTEGR_API void DtEph3(LDouble tj);
typedef int (*nsfunc)(ISatellite* isat); typedef void (*jdfunc)(long, long double, int*, int*, int*, long double*); typedef void (*djfunc)(long*,long double*,int, int, int, long double); //typedef void (*setnameconst)(char*); typedef void (*setnameconst)(char*, char*, char*); typedef void (*setvars)(planet*, char*, char*, char*, vector<FF_ms>*, nrlmsise_flags*, ap_array*); typedef void (*dteph3)(long double); typedef void (*settph)(Eph*); typedef Eph (*gettph)(); typedef void (*jd2)(long, long double, int*, int*, int*, int*, int*, long double*);
jdfunc myjdfunc; djfunc mydjfunc; setnameconst mysetnameconst; setvars mysetvars; settph mysettph; gettph mygettph; dteph3 mydteph3; jd2 myjd2;
NewSatInit st;
HINSTANCE h; // для явного подключения
int dim, mv_par, porobr, flagutochn, timescaleutochn; //int dtnum, dtephnum; // неявное подключение long filesize, jtutochn; bool aprior, iscalciter; char sdateutochn[9], stimeutochn[20]; long double sigmaD, sigmaV, Sb0, kappa0, jt0, tj0, tjutochn;
struct planet SUN_MOON; char name_pol_eph[80]; char name_const[80]; char rab_name[80]; char *NAme_A; FF_ms *F = NULL; static int j_atm=0; static int j_cost=0; nrlmsise_flags flags; ap_array aph; vector<FF_ms> F2;
int _tmain(int argc, _TCHAR* argv[]) // явное подключение { int i, j, timescale, year, month, day, hour, minute, intval, flres; long jt; long double tj, second, x, y, z, vx, vy, vz, val; char s[120], txt[120], syear[5], smonth[3], sday[3], shour[3], sminute[3], ssecond[13], shelp[20]; T3DVector rv[2]; nsfunc mynsfunc; NMTMatrix nmtmatrix(6,6); FILE* f1; FILE* f2; FILE *fnmt;
//h = LoadLibrary(L"DLLIntegr.dll"); h = LoadLibraryA(dll_name); //h = LoadLibraryA("DLLIntegrdbg.dll"); if (!h) { setlocale(LC_CTYPE,"Russian"); //printf("Ошибка загрузки DLLIntegr.dll !\n"); printf("Ошибка загрузки dll интегратора!\n"); setlocale(LC_ALL,"English_UnitedStates.1252"); getch(); exit(0); } create_t create = (create_t)GetProcAddress(h,"create"); if (!create) { setlocale(LC_CTYPE,"Russian"); printf("Ошибка вызова конструктора класса ISatellite !\n"); setlocale(LC_ALL,"English_UnitedStates.1252"); getch(); exit(0); } ISatellite* isat = create("initdata.txt"); jtutochn = 2455008; tjutochn = 0.40648148148148144; timescale = 1; isat->GetRV(jtutochn,tjutochn,rv,timescale); //начало отладочного варианта printf("jt = %ld\n",jtutochn); printf("tj = %.17lf\n",tjutochn); printf("x = %.16le\n",rv[0].x); printf("y = %.16le\n",rv[0].y); printf("z = %.16le\n",rv[0].z); printf("Vx = %.16le\n",rv[1].x); printf("Vy = %.16le\n",rv[1].y); printf("Vz = %.16le\n",rv[1].z); printf("\n"); isat->GetMatrix(nmtmatrix); tjutochn = 0.40648000000000000; isat->GetRV(jtutochn,tjutochn,rv,timescale); printf("jt = %ld\n",jtutochn); printf("tj = %.17lf\n",tjutochn); printf("x = %.16le\n",rv[0].x); printf("y = %.16le\n",rv[0].y); printf("z = %.16le\n",rv[0].z); printf("Vx = %.16le\n",rv[1].x); printf("Vy = %.16le\n",rv[1].y); printf("Vz = %.16le\n",rv[1].z); printf("\n"); isat->GetMatrix(nmtmatrix); tjutochn = 0.40600000000000000; isat->GetRV(jtutochn,tjutochn,rv,timescale); isat->GetMatrix(nmtmatrix); //конец отладочного варианта //delete isat; //isat = NULL; printf("jt = %ld\n",jtutochn); printf("tj = %.17lf\n",tjutochn); printf("x = %.16le\n",rv[0].x); printf("y = %.16le\n",rv[0].y); printf("z = %.16le\n",rv[0].z); printf("Vx = %.16le\n",rv[1].x); printf("Vy = %.16le\n",rv[1].y); printf("Vz = %.16le\n",rv[1].z); printf("\n"); x = rv[0].x * AE; y = rv[0].y * AE; z = rv[0].z * AE; vx = rv[1].x * AE / DAY; vy = rv[1].y * AE / DAY; vz = rv[1].z * AE / DAY; //delete isat; isat->freeresources(); isat = NULL; /* // записывание полученных данных в файл initdata2.txt f1 = fopen("initdata.txt","rt"); f2 = fopen("initdata2.txt","w+"); fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); fscanf(f1,"%s",txt); //JD2(jtutochn,tjutochn,&year,&month,&day,&hour,&minute,&second); myjd2 = (jd2)GetProcAddress(h,"JD2"); if (!myjd2) { setlocale(LC_CTYPE,"Russian"); printf("Ошибка вызова функции JD2 !\n"); setlocale(LC_ALL,"English_UnitedStates.1252"); getch(); exit(0); } myjd2(jtutochn,tjutochn,&year,&month,&day,&hour,&minute,&second); // формирование строки s, содержащей дату itoa(year,syear,10); itoa(month,smonth,10); if (month<10) { strcpy(shelp,"0"); strcat(shelp,smonth); strcpy(smonth,shelp); } itoa(day,sday,10); if (day<10) { strcpy(shelp,"0"); strcat(shelp,sday); strcpy(sday,shelp); } strcpy(s,sday); strcat(s,smonth); strcat(s,syear); fprintf(f2,"%s\n",s); fscanf(f1,"%s",txt); // формирование строки s, содержащую время itoa(hour,shour,10); if (hour<10) { strcpy(shelp,"0"); strcat(shelp,shour); strcpy(shour,shelp); } itoa(minute,sminute,10); if (minute<10) { strcpy(shelp,"0"); strcat(shelp,sminute); strcpy(sminute,shelp); } // _gcvt(second,9,ssecond); sprintf(ssecond,"%2.9f",second); if (second<10) { strcpy(shelp,"0"); strcat(shelp,ssecond); strcpy(ssecond,shelp); } strcpy(s,shour); strcat(s,sminute); strcat(s,ssecond); fprintf(f2,"%s\n",s); fscanf(f1,"%s",txt); // формирование строки s, содержащую систему координат //fprintf(f2,"%s\n",s); intval = 0; // 0 -- инерциальная система координат fprintf(f2,"%d\n",intval); //fscanf(f1,"%s",txt); fscanf(f1,"%s",s); //intval = 0; // 0-- шкала времени et // формирование строки s, содержащую шкалу времени fprintf(f2,"%s\n",s); fscanf(f1,"%s",txt); fprintf(f2,"%.16le\n",x); // запись координаты x fscanf(f1,"%s",txt); fprintf(f2,"%.16le\n",y); // записаь координаты y fscanf(f1,"%s",txt); fprintf(f2,"%.16le\n",z); // записаь координаты z fscanf(f1,"%s",txt); fprintf(f2,"%.16le\n",vx); // запись координаты vx fscanf(f1,"%s",txt); fprintf(f2,"%.16le\n",vy); // запись координаты vy fscanf(f1,"%s",txt); fprintf(f2,"%.16le\n",vz); // запись координаты vz while (!feof(f1)) { fscanf(f1,"%s",s); fprintf(f2,"%s\n",s); } fclose(f1); fclose(f2); Sleep(2000); // задежка выполнения программы на 2 секунды isat = create("initdata2.txt"); fnmt = fopen("nmtmatr.txt","w+"); // инициализация jt и tj jt = 2455008L; tj = 0.28225398147530056L; timescale = 0; // шкала времени--ET isat->GetRV(jt,tj,rv,timescale); printf("jt = %ld\n",jt); printf("tj = %.17lf\n",tj); printf("x = %.16le\n",rv[0].x); printf("y = %.16le\n",rv[0].y); printf("z = %.16le\n",rv[0].z); printf("Vx = %.16le\n",rv[1].x); printf("Vy = %.16le\n",rv[1].y); printf("Vz = %.16le\n",rv[1].z); printf("\n"); //isat->GetCurrentMatrix(nmtmatrix); isat->GetMatrix(nmtmatrix); //fnmt = fopen("nmtmatr.txt","w+"); for (i=0; i<6; i++) { for (j=0; j<6; j++) { val = nmtmatrix(i,j); //val = nmtmatrix.data[i*6 + j]; fprintf(fnmt,"%.16le\n",val); } } fprintf(fnmt,"\n\n"); // присвоение новых значений jt и tj jt = 2455008L; tj = 0.28212157407274951L; isat->GetRV(jt,tj,rv,timescale); printf("jt = %ld\n",jt); printf("tj = %.17lf\n",tj); printf("x = %.16le\n",rv[0].x); printf("y = %.16le\n",rv[0].y); printf("z = %.16le\n",rv[0].z); printf("Vx = %.16le\n",rv[1].x); printf("Vy = %.16le\n",rv[1].y); printf("Vz = %.16le\n",rv[1].z); //isat->GetCurrentMatrix(nmtmatrix); isat->GetMatrix(nmtmatrix); for (i=0; i<6; i++) { for (j=0; j<6; j++) { val = nmtmatrix(i,j); //val = nmtmatrix.data[i*6 + j]; fprintf(fnmt,"%.16le\n",val); } } fclose(fnmt); //isat->freeresources(); // освобождение ресурсов из-под объекта isat класса Satellite delete isat; isat = NULL; */ try { flres = FreeLibrary(h); } catch(exception& ex1) { printf("%s\n",ex1.what()); } setlocale(LC_CTYPE,"Russian"); printf("DLLIntegr.dll успешно завершила свою работу.\n"); //printf("Нажмите любую клавишу для выхода из программы.\n"); setlocale(LC_ALL,"English_UnitedStates.1252"); //getch(); try { return 0; } catch(exception& ex2) { printf("%s\n",ex2.what()); } }
|
2) файл dllmain.cpp : Код | // dllmain.cpp: определяет точку входа для приложения DLL. //#include "stdafx.h" #include <windows.h> //#include "Satellite.h" #include "stdafx.h"
extern bool iscalciter; extern int dtnum; extern int dtephnum; extern planet SUN_MOON; extern nrlmsise_flags flags; extern ap_array aph; extern NewSatInit st;
//extern "C" __declspec(dllexport) ISatellite* __cdecl create(NewSatInit nst) //extern "C" DLLINTEGR_API ISatellite* __cdecl create(NewSatInit nst, bool isfirst) //extern "C" DLLINTEGR_API ISatellite* __cdecl create() extern "C" DLLINTEGR_API ISatellite* __cdecl create(char* filename) { int i; NewSatInit nst; ISatellite* isat=NULL;
iscalciter = false; //if (isfirst==true) //{ dtnum = -1; dtephnum = -1; //} Read_config(); nst = read_data(filename); st = nst; //if (isfirst==true) //{ for (i=0; i<11; i++) { SUN_MOON.a66[i][0].x = SUN_MOON.a66[i][0].y = SUN_MOON.a66[i][0].z = 0.0; SUN_MOON.a66[i][1].x = SUN_MOON.a66[i][1].y = SUN_MOON.a66[i][1].z = 0.0; } SUN_MOON.t = 0.0; for (i=0; i<7; i++) aph.a[i] = 100; flags.switches[0] = 0; for (i=1; i<24; i++) flags.switches[i] = 1; // Start_Dtepol(); DtEphFromFile(); DTEPOLFromFile(); //} //return new Satellite(nst); isat = new Satellite(nst); INewSatellite(isat); return isat; }
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; }
|
Добавлено через 1 минуту и 5 секунд2) файл dllmain.cpp : // dllmain.cpp: определяет точку входа для приложения DLL. //#include "stdafx.h" #include <windows.h> //#include "Satellite.h" #include "stdafx.h" extern bool iscalciter; extern int dtnum; extern int dtephnum; extern planet SUN_MOON; extern nrlmsise_flags flags; extern ap_array aph; extern NewSatInit st; //extern "C" __declspec(dllexport) ISatellite* __cdecl create(NewSatInit nst) //extern "C" DLLINTEGR_API ISatellite* __cdecl create(NewSatInit nst, bool isfirst) //extern "C" DLLINTEGR_API ISatellite* __cdecl create() extern "C" DLLINTEGR_API ISatellite* __cdecl create(char* filename) { int i; NewSatInit nst; ISatellite* isat=NULL; iscalciter = false; //if (isfirst==true) //{ dtnum = -1; dtephnum = -1; //} Read_config(); nst = read_data(filename); st = nst; //if (isfirst==true) //{ for (i=0; i<11; i++) { SUN_MOON.a66[i][0].x = SUN_MOON.a66[i][0].y = SUN_MOON.a66[i][0].z = 0.0; SUN_MOON.a66[i][1].x = SUN_MOON.a66[i][1].y = SUN_MOON.a66[i][1].z = 0.0; } SUN_MOON.t = 0.0; for (i=0; i<7; i++) aph.a[i] = 100; flags.switches[0] = 0; for (i=1; i<24; i++) flags.switches[i] = 1; // Start_Dtepol(); DtEphFromFile(); DTEPOLFromFile(); //} //return new Satellite(nst); isat = new Satellite(nst); INewSatellite(isat); return isat; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } Добавлено через 5 минут и 46 секунд3) файл DLLIntegr.cpp (фрагмент кода): Код | void Read_config() { int i, j, n, n2, FF_mslen, fnlength, pos; char c, curDir[80], curDir2[80]; FILE* Read; FILE* FAF_file;
NAme_A = new char[80]; if ((Read = fopen("config.dat","r"))!=NULL) { char a[80]; i = fscanf(Read, "%s\n",a); i = fscanf(Read, "%s\n",a); i = fscanf(Read, "%s\n",name_const); i = fscanf(Read, "%s\n",name_pol_eph); fclose(Read); NAme_A = strcpy(rab_name,name_const); NAme_A = strcat(rab_name,"\\fafw.dat"); } else { //printf("Error of opening file config.dat .\n"); //exit(1); memset(&curDir[0],0,80); fnlength = GetModuleFileNameA(GetModuleHandle(NULL),&curDir[0],80); for (i=(fnlength-1); i>=0; i--) { c = curDir[i]; if (c=='\\') { pos = i; break; } } strncpy(curDir2,curDir,pos); curDir2[pos] = '\0'; //strcpy(name_const, "F:\\Roman\\Roman\\CallDLLIntegr\\CallDLLIntegr\\Const"); strcpy(name_const,curDir2); strcat(name_const,"\\Const"); //strcpy(name_pol_eph, "F:\\Roman\\Roman\\CallDLLIntegr\\CallDLLIntegr\\DE403"); strcpy(name_pol_eph,curDir2); strcat(name_pol_eph,"\\DE403"); NAme_A = strcpy(rab_name, name_const); NAme_A = strcat(rab_name, "\\fafw.dat"); } // чтение информации из файла fafw.dat F2.clear(); /*if ((hFile = open(NAme_A, O_RDWR)) == -1) { fprintf(stderr, "File %s not found", NAme_A); exit(1); } filesize = lseek(hFile, 0, SEEK_END); close(hFile); */ FAF_file = fopen(NAme_A, "rb"); if (FAF_file==NULL) { fprintf(stderr,"File %s not found", NAme_A); exit(1); } fseek(FAF_file, 0 , SEEK_END); filesize = ftell(FAF_file); fclose(FAF_file); FF_mslen = (int)(filesize / 32); //FF_mslen = (int)(filesize / (8 * sizeof(long double))); /* F = new FF_ms[FF_mslen]; */ n = FF_mslen / 1000; if (FF_mslen==(n*1000)) { n2 = n; } else { n2 = n + 1; } F2.reserve(n2*1000); F2.resize(FF_mslen); DWORD dwNum = MultiByteToWideChar(CP_ACP,0,NAme_A,-1,NULL,0); WCHAR* pwText = new WCHAR[dwNum]; MultiByteToWideChar(CP_ACP,0,NAme_A,-1,pwText,dwNum); /* static */ HANDLE hFile = CreateFile(pwText,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (hFile!=INVALID_HANDLE_VALUE) { hMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); if (hMapping !=NULL) { CloseHandle(hFile); F = (FF_ms*)MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0); if (F) { CloseHandle(hMapping); j = 1; for (i=0; i<FF_mslen; i++) F2[i] = F[i]; } } } UnmapViewOfFile(F); F = NULL; } // конец функции Read_config
|
|