Я так уже пробовал, не получилось. проблему решил. CreateProcess(L"test.exe", L"test.exe -x", 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
А зачем второй раз test.exe указываешь? Вторым параметром передается аргумент процесса. Если в первом стоит NULL, то во втором надо указывать "имя_модуля аргумент"...
передача массива в DLL постановка задачи: нужно было с функции передать в DLL библиотеку значения А, В, С, и т.д. и одномерный массив для вычисления функции, библиотека возвращает результат операции или же код ошибки (тоже результат 666). реализация: глобальные переменные Code: int mas[5]; int el, g; int m_a[5], m_b[5],m_c[5],m_matrix[80]; int Number; int am,bm,cm; Функция RUN Code: void CMyFrameWin::OnRun() { char sq[80]; FILE *read; read=fopen("matrix.txt","r"); while(!feof(read)){ for(int g=0;g<5;g++) { fscanf(read,"%d",&el); mas[g]=el; fscanf(read,"\n"); sprintf(sq,"%d", mas[g]); MessageBox(sq,"ELEMENT MASIVA"); // проверка елементов } } int res; HINSTANCE hDll; char s[100]; hDll=::LoadLibrary("MyDll"); if (hDll == NULL) { ::MessageBox(NULL,"ERROR","ERROR! File MyDll.dll not found!",MB_OK| MB_ICONSTOP); } else { typedef int (*FUN)(int*,int,int,int,int); FUN func; func=(FUN)::GetProcAddress(hDll, "calc"); res=(*func)(mas,Number,am,bm,cm); if (res==666) { ::MessageBox(NULL,"ERROR! ","DATA ERROR!",MB_OK| MB_ICONSTOP); } else { sprintf(s,"%d", res); MessageBox(s,"Result"); //создание и запись результата в файл FILE *result; result=fopen("result.txt","w"); fprintf(result,"%d",res); fclose(result); } ::FreeLibrary(hDll); } массив заполняется значениями из файла matrix.txt вида : Code: 0 1 2 3 4 и собственно сама dll - ка Code: #include "stdafx.h" #include <conio.h> int calc ( int *mas, int Number, int am, int bm, int cm) { int r=Number; int a=am,b=bm,c=cm,n=5,resalt; //int mas[5]={0,1,2,3,4}; if(r==9){ _asm{ mov eax,0 mov ecx,n lea esi,mas l1: add eax,[esi] add esi,4 loop l1 add eax,c mov resalt,eax }} else if(r<=5){ _asm{ mov eax,a sub eax,c mov a,eax mov eax,b mul b add eax,a mov ebx,c cdq div ebx mov resalt,eax }} else resalt=666; return resalt; } если массив не передавать а забить в dll типа так //int mas[5]={0,1,2,3,4}; то dll - ка работает нормально, а массив передать никак не получается. В результате получаем хз что.. типа 343987428... и т.д. кто разбирается посмотрите что там в коде не так... где то я втыкаю.. или у кого есть ссыль на хелп по передаче массива в dll буду рад почитать. спасибо.
Проблема думаю в том, что mas[0] и mas[1] не идут в памяти друг за другом. а могут указывать на разные адресса в памяти (зависит от компилятора). поэтому здесь нельзя вычислять как mas + Номер элемента*4...
ни один компилятор СИ не генерирует массив таким образом как вы сказали То что вы сказали относится к динамическим спискам. Массивы всегда последовательно располагаются в памяти. На этом свойстве массивов основана адресация по указателю.
значить вот такая история с подключением dll.. сначала когда массив задавался в самой библиотеке (int mas[5]={0,1,2,3,4} все работало без претензий при любом значении int Number, int am, int bm, int cm всегда получали правильное решение. библиотека выглядела так: Code: #include "stdafx.h" #include <conio.h> int calc (int Number, int am, int bm, int cm) { int r=Number; int a=am,b=bm,c=cm,n=5,resalt; int mas[5]={0,1,2,3,4}; if(r==9){ [B] [COLOR=DarkOrange] _asm{ mov eax,0 mov ecx,n lea esi,mas l1: add eax,[esi] add esi,4 loop l1 add eax,c mov resalt,eax[/COLOR][/B] }} else if(r<=5){ _asm{ mov eax,a sub eax,c mov a,eax mov eax,b mul b add eax,a mov ebx,c cdq div ebx mov resalt,eax }} else resalt=666; return resalt; } Другим цветом выделил часть кода которая работает с массивом. потом массив я передал с другой функции, так как было описано ТУТ для проверки корректности передачи элементов использовал вывод каждого Code: int calc ( int *mas, int Number, int am, int bm, int cm) { int r=Number; int a=am,b=bm,c=cm,n=5,resalt; [B][COLOR=DarkOrange]char sdll[100] = {0}; sprintf(sdll,"%d", mas[1]); MessageBoxA(NULL, sdll,"Result", NULL);[/COLOR][/B] if(r==9){.......... тут все нормально. элементы массива корректно могут считываться и использоваться библиотекой. но сам асм код который отвечает за обработку массива в результат кидал постоянно значения типа 3645435664 или 8764599943..... вышел с положения только С++ кодом... Code: if(r==9){ int temp=0; for(int i=0;i<n;i++) { temp=temp+mas[i]; } resalt=cm +temp ; } так и не понял почему предыдущий РАБОТАЮЩИЙ асм код для массива который был обьявлен внутри dll не покатил для массива который передаем из другой функции... а нужно именно асм код.. трабла в адресации памяти? или хз? кто что посоветует? спасибо. -------------------EDIT--------------------------- решение проблемы - пост от bons. bons, спасибо. -------------------EDIT---------------------------
Как мне сделать функцию с параметрами но при этом если параметры незадавать выполнялись параметры по умолчанию
2 NetSter Не используй инструкцию lea вместо lea esi, mas напиши mov esi, mas - так будет правильно. Компилятор это превратит примерно в следующее: mov esi, DWORD PTR [ebp+8] то есть занесение в esi содержимого параметра mas и это есть правда. P.S. а когда ты вместо mov пишешь lea получается: lea esi, DWORD PTR [ebp+8] что есть занесение в esi адреса переменной mas, что тебе совсем не нужно
точка входа в программу функция main(), а vaild ето тип возращаемый ОС тип.... первый раз вижу vaild - где ты ето увидел?
есть такой код: Code: struct abs1 { unsigned char a; //1-byte unsigned short b;//2-byte }; void pr(unsigned char*t) { for(int i=0;i<sizeof(t);i++) printf("%x ",t[i]); } int main() { abs1 test; test.a = (unsigned char)0x31; test.b = (unsigned short)0x32; printf("Struct size: %d\n",sizeof(test)); pr((unsigned char*)&test); getchar(); return 0; } Выводит: Struct size: 4 31 CC 32 00 Почему размер структуры 4 если (чар -1баит и шорт-2байта) должен быть 3 байта. Лишний байт виден при печати структуры (второй - 0хСС) как от него избавится?
Если я правильно понимаю после очистки мамяти будет 31 00 32 00, я прав? Мне же необходимо от "лишнего" байта избавится, т.е. структура должна быть размером именно 3 байта.
нужно прочесть данные из реестра, тип данных REG_SZ, компилиться без ошибок, но в буфере(Reget) где должны быть данные пусто часть кода Code: HKEY hKey; RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfeaces\\{2BF69BB5-EB8E-48CE-8D1F-FA2CCF27B}", 0, KEY_READ, &hKey); char Reget[64]; DWORD RegetPath = sizeof(Reget); DWORD type = REG_SZ; RegQueryValueExA(hKey, "DhcpIPAddress", NULL, &type, (PBYTE)Reget, &RegetPath); RegCloseKey(hKey); printf(Reget);