Войти

Показать полную графическую версию : Перевести код с Delphi на С


ddv122
26-08-2012, 17:06
Доброго дня может кто поможет перевести код с Delphi на С
PLUGIN_NAME='biss';
procedure On_Send_Dll_ID_Name(var Name:array of char );cdecl;
var s:PChar;
i:Integer;
begin s:=PLUGIN_NAME;
for i:=0 to Length(s) do Name:=s;
end;
exports On_Send_Dll_ID_Name name 'On_Send_Dll_ID_Name';

ferget
26-08-2012, 19:11
примерно так


#include <string.h>
................................................
const char* PLUGIN_NAME="biss";

extern "C" __declspec(dllexport) void __stdcall On_Send_Dll_ID_Name(char* Name)
{
strcpy(Name,PLUGIN_NAME);
}

ddv122
26-08-2012, 21:06
пробовал так, но это приводит к зависанию программы.Пишу dll осталось передать имя
если запускать так, то плагин работает но нет имени

extern "C" __declspec(dllexport) void __stdcall On_Send_Dll_ID_Name() { }

И рабочий пример на Delphi. может вы увидите где у меня ошибка. что не так на С, почему не передаёт имя
http://ymalbisssport.narod.ru/BISS.zip

ferget
26-08-2012, 21:43
Тут надо заранее выделять память под Name


int main()
{
char* RetName=new char[255];
On_Send_Dll_ID_Name(RetName);
//тут используется RetName
delete[] RetName;
return 0;
}

ddv122
26-08-2012, 22:28
ferget, если выделить - получаем массу ошибок или я что не так делаю
Если не затруднит , можете глянуть мой проект.Мне нужно вывести имя, в таком виде как у меня он сейчас- он работает но нету имени, запросы доходят

ferget
26-08-2012, 23:24
Builer'а нету, поэтому сделал тестовую Dll в VS

DLL:

файл main.cpp

#include <string.h>
#include "main.h"

const char* PLUGIN_NAME="biss";
// a sample exported function
extern "C" __declspec(dllexport) void __stdcall On_Send_Dll_ID_Name(char* Name)
{
strcpy(Name,PLUGIN_NAME);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;

case DLL_PROCESS_DETACH:
// detach from process
break;

case DLL_THREAD_ATTACH:
// attach to thread
break;

case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}

файл main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/* To use this exported function of dll, include this header
* in your project.
*/

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

__declspec(dllexport) void __stdcall On_Send_Dll_ID_Name(char* Name);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

для проверки

файл testDll.cpp

#include <iostream>
#include "main.h"
using namespace std;

#pragma comment(lib,"Win32Project1")

int main()
{
char* ls=new char[20];
On_Send_Dll_ID_Name(ls);
cout<<ls<<endl;
delete[] ls;
return 0;
}

выводит в консоль biss

ddv122
26-08-2012, 23:40
ferget, всё ровно что то не то, сразу навешивается программа (DVB DREAM), а вот с Delphi примером всё хорошо.

ferget
27-08-2012, 00:05
тогда можно попробовать так


extern "C" __declspec(dllexport) const char* __stdcall On_Send_Dll_ID_Name()
{
return "biss";
}


__declspec(dllexport) const char* __stdcall On_Send_Dll_ID_Name();

проверка

#include <iostream>
#include <string>
#include "main.h"
using namespace std;

#pragma comment(lib,"Win32Project1")

int main()
{
string ls(SomeFunction());
cout<<ls<<endl;
return 0;
}

ddv122
27-08-2012, 00:13
ferget, [C++ Error] E2147 'SomeFunction' cannot start a parameter declaration

ddv122
27-08-2012, 00:18
Вот что получается, но если положить плагин biss то мой безымянный подхватит его имя
Вот ещё что нашел
typedef VOID (*On_Send_Dll_ID_Name)(char *Name );
● Name is a pointer to a character array with fixed size of 128 bytes
You MUST copy your plugin name to this location. The given string names the plugin and
also will be used to append the plugin pull-down menu inside WTV.

ferget
27-08-2012, 00:30
Посмотрю DVB DREAM, что там и как

ferget
27-08-2012, 03:17
На официальном сайте программы лежит SDK, там есть примеры на С++, там показано как имя выводится выводится

ddv122
27-08-2012, 12:02
ferget, я видел sdk . я с их и начинал но не чего это не дало, я в другом форуме с людьми всё перепробовали...но результатов не дало..на Delphi всё работает..




© OSzone.net 2001-2012