ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1861  
Старый 19.11.2008, 02:04
_Kris_
Познающий
Регистрация: 22.07.2008
Сообщений: 62
Провел на форуме:
304390

Репутация: 172
По умолчанию

Полный путь до процесса? до твоего test.exe

Добавлено: если, что его не сюда постить надо было, а вставить в код и попробывать скомпилить.


Код:

STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
CreateProcess(L"C:\\Program Files\\TEST\\test.exe", L"-x", 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);
ExitProcess(0);

Последний раз редактировалось _Kris_; 19.11.2008 в 02:32..
 
Ответить с цитированием

  #1862  
Старый 19.11.2008, 02:15
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

Я так уже пробовал, не получилось.

проблему решил.

CreateProcess(L"test.exe", L"test.exe -x", 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);

Последний раз редактировалось ntldr; 19.11.2008 в 14:52..
 
Ответить с цитированием

  #1863  
Старый 19.11.2008, 15:41
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

А зачем второй раз test.exe указываешь? Вторым параметром передается аргумент процесса. Если в первом стоит NULL, то во втором надо указывать "имя_модуля аргумент"...
 
Ответить с цитированием

  #1864  
Старый 19.11.2008, 16:26
ntldr
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
Провел на форуме:
2364957

Репутация: 479
По умолчанию

Цитата:
Сообщение от criz  
А зачем второй раз test.exe указываешь? Вторым параметром передается аргумент процесса. Если в первом стоит NULL, то во втором надо указывать "имя_модуля аргумент"...
я знаю, но таким способом у меня почему-то не запускалось вообще
 
Ответить с цитированием

  #1865  
Старый 19.11.2008, 20:21
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

Цитата:
Сообщение от ntldr  
я знаю, но таким способом у меня почему-то не запускалось вообще
Попробуй вызвать GetLastError(), может узнаешь в чем проблема.
 
Ответить с цитированием

передача массива в DLL
  #1866  
Старый 19.11.2008, 22:08
NetSter
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме:
4275992

Репутация: 1188


Question передача массива в DLL

постановка задачи: нужно было с функции передать в DLL библиотеку значения А, В, С, и т.д. и одномерный массив для вычисления функции, библиотека возвращает результат операции или же код ошибки (тоже результат 666).
реализация:

глобальные переменные
Код:
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
Код:
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 вида :
Код:
0
1
2
3
4
и собственно сама dll - ка

Код:
#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 буду рад почитать.
спасибо.
 
Ответить с цитированием

  #1867  
Старый 19.11.2008, 22:19
GlOFF
Постоянный
Регистрация: 08.05.2006
Сообщений: 816
Провел на форуме:
1845671

Репутация: 1338


По умолчанию

Проблема думаю в том, что mas[0] и mas[1] не идут в памяти друг за другом. а могут указывать на разные адресса в памяти (зависит от компилятора). поэтому здесь нельзя вычислять как mas + Номер элемента*4...
 
Ответить с цитированием

  #1868  
Старый 19.11.2008, 22:25
NetSter
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме:
4275992

Репутация: 1188


По умолчанию

все билдится в Вижуал Студио 2008 с future pack - oм (хотя думаю фьюче пак не при чем)
 
Ответить с цитированием

  #1869  
Старый 19.11.2008, 22:48
groupby
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме:
127017

Репутация: 61
Talking

Цитата:
Сообщение от GlOFF  
Проблема думаю в том, что mas[0] и mas[1] не идут в памяти друг за другом. а могут указывать на разные адресса в памяти (зависит от компилятора). поэтому здесь нельзя вычислять как mas + Номер элемента*4...
ни один компилятор СИ не генерирует массив таким образом как вы сказали

То что вы сказали относится к динамическим спискам. Массивы всегда последовательно располагаются в памяти. На этом свойстве массивов основана адресация по указателю.
 
Ответить с цитированием

  #1870  
Старый 20.11.2008, 02:05
NetSter
студент
Регистрация: 30.07.2007
Сообщений: 800
Провел на форуме:
4275992

Репутация: 1188


Lightbulb

значить вот такая история с подключением dll..
сначала когда массив задавался в самой библиотеке
(int mas[5]={0,1,2,3,4} все работало без претензий при любом значении int Number, int am, int bm, int cm всегда получали правильное решение.
библиотека выглядела так:
Код:
#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){
	    _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;
}
Другим цветом выделил часть кода которая работает с массивом.

потом массив я передал с другой функции, так как было описано ТУТ
для проверки корректности передачи элементов использовал вывод каждого
Код:
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;
	char sdll[100] = {0};
	sprintf(sdll,"%d", mas[1]);
	MessageBoxA(NULL, sdll,"Result", NULL);
	if(r==9){..........
тут все нормально. элементы массива корректно могут считываться и использоваться библиотекой.
но сам асм код который отвечает за обработку массива в результат кидал постоянно значения типа 3645435664 или 8764599943.....
вышел с положения только С++ кодом...
Код:
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---------------------------

Последний раз редактировалось NetSter; 21.11.2008 в 19:38.. Причина: решение проблемы.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP, PERL, MySQL, JavaScript 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Форумы 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ