Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2011, 21:32   #1
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
Восклицание Перевод кода с C++ на Delphi

Добрый день! Если кто может, помогите с переводом кода)) Сам я бум бум в C++, но есть на нем код и его нужно перевести в Delphi..
Интересует экспорт из DLL, реализованно так:

Код:
#include <windows.h>
#include <iostream>
#include <fstream>


#define TACCESS_API  __declspec(dllimport)
typedef bool (WINAPI *tcallback)(BYTE* pData);
typedef BYTE* (WINAPI *typeSendCommand)(BYTE* pData);
typedef bool (WINAPI  *typeFreeMemory)(BYTE* pData);
typedef bool (WINAPI *typeSetCallback)(tcallback pCallback);


std::ofstream xmlfile;
typeFreeMemory FreeMemory;


bool CALLBACK acceptor(BYTE *pData)
{
	xmlfile<<pData<<std::endl;
	FreeMemory(pData);
	return true;
}

int main(int argc, char* argv[]) {

	setlocale(LC_CTYPE, "");

	std::cout<<"Statring!"<<std::endl;
	xmlfile.open("test.xml");
	xmlfile<<"<?xml version='1.0' encoding='UTF-8'?>";
	xmlfile<<"<root>";

	HMODULE hm = LoadLibrary("Debug\\txmlconnector.dll");
	if (hm) {
		typeSetCallback SetCallback =
			reinterpret_cast<typeSetCallback>(GetProcAddress(hm, "SetCallback"));

		FreeMemory =
			reinterpret_cast<typeFreeMemory>(GetProcAddress(hm, "FreeMemory"));

		SetCallback(acceptor);
	

		typeSendCommand SendCommand =
			reinterpret_cast<typeSendCommand>(GetProcAddress(hm,"SendCommand"));
		if (!SendCommand)	{
			printf("\"SendCommand\" not found (0x%X)\n", GetLastError());
			return -1;
		}
		else {
			BYTE* ss = SendCommand(reinterpret_cast<BYTE*>(
				"<command id='connect'>"
				"<login>KOKS</login><password>koks</password>"
				"<host>192.168.15.15</host><port>3901</port>"
				"<logsdir>.\\LOGS\\</logsdir><loglevel>0</loglevel></command>"));
			std::cout<<reinterpret_cast<const char*>(ss);
			FreeMemory(ss);

			Sleep(10000);

			ss = SendCommand(reinterpret_cast<BYTE*>("<command id='subscribe'>"
				"<alltrades><secid>304</secid></alltrades>"  //идентификаторы взял просто для примера
				"<quotations><secid>304</secid></quotations>" //в реально кода надо ориентировать на то,
				"<quotes><secid>304</secid></quotes>" //что присылвает сервер
				"</command>"));
			std::cout<<reinterpret_cast<const char*>(ss);
			FreeMemory(ss);

			Sleep(1000);

			ss = SendCommand(reinterpret_cast<BYTE*>(
					"<command id='disconnect'/>"));
				std::cout<<reinterpret_cast<char*>(ss);
			FreeMemory(ss);
		}
	
		try {
			FreeLibrary(hm);
		}
		catch (...) {
			std::cout<<"Fail in FreeLibrary";
		}
	}
	int err = GetLastError();
	xmlfile<<"</root>";

	std::cout<<"\nEnded...\n";
	char c;
	std::cin>>c;
	return 0;
}
Если кто может, помогите, пожалуйста, очень надо! Заранее премного благодарен!


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 22.06.2011 в 22:16.
atagilov вне форума Ответить с цитированием
Старый 22.06.2011, 21:47   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где здесь вообще экспорт?
импорт вижу
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.06.2011, 21:52   #3
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

ээээммм.. простите, я в C++ не алле))) а что значит экспорт?)) это код исполняемой программы, которая работает с DLL.. вот три функции SetCallback, SendCommand и FreeMemory из этой DLL)
atagilov вне форума Ответить с цитированием
Старый 22.06.2011, 21:58   #4
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

если вот так сделать в Delphi:

Код:
type
                CallBack = procedure(pData : DWORD);
 
                ...
 
                procedure SetCallback(pCallback : CallBack); stdcall; external 'txmlconnector.dll';
                function SendCommand(pData : DWORD) : DWORD; stdcall; external 'txmlconnector.dll';
                procedure FreeMemory(pData : DWORD); stdcall; external 'txmlconnector.dll';
правильным будет?
atagilov вне форума Ответить с цитированием
Старый 22.06.2011, 21:59   #5
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

просто чтобы правильно перевести, нужно знать хорошо оба языка.. я к сожалению знаю только Delphi..
atagilov вне форума Ответить с цитированием
Старый 22.06.2011, 22:09   #6
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

а чем в Delphi можно заменить BYTE* C++? DWORD?
atagilov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод кода с Pascal в Delphi Rin Общие вопросы Delphi 5 09.01.2011 01:39
Перевод кода Delphi-Pascal! Метод Пауэлла bestlover Помощь студентам 3 21.12.2009 17:35
Перевод кода на С++ Golovastik Помощь студентам 0 04.06.2009 14:27
Перевод кода с Fortran-77 на Delphi unhide Помощь студентам 3 20.05.2008 14:27