Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перевести код с Delphi на С (http://forum.oszone.net/showthread.php?t=241385)

ddv122 26-08-2012 17:06 1977296

Перевести код с Delphi на С
 
Доброго дня может кто поможет перевести код с 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 1977351

примерно так

Код:

#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 1977390

пробовал так, но это приводит к зависанию программы.Пишу 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 1977409

Тут надо заранее выделять память под 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 1977428

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

ferget 26-08-2012 23:24 1977456

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 1977468

ferget, всё ровно что то не то, сразу навешивается программа (DVB DREAM), а вот с Delphi примером всё хорошо.

ferget 27-08-2012 00:05 1977480

тогда можно попробовать так

Код:

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 1977483

ferget,
Код:

[C++ Error] E2147 'SomeFunction' cannot start a parameter declaration

ddv122 27-08-2012 00:18 1977485

Вложений: 1
Вот что получается, но если положить плагин 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 1977491

Посмотрю DVB DREAM, что там и как

ferget 27-08-2012 03:17 1977518

На официальном сайте программы лежит SDK, там есть примеры на С++, там показано как имя выводится выводится

ddv122 27-08-2012 12:02 1977686

ferget, я видел sdk . я с их и начинал но не чего это не дало, я в другом форуме с людьми всё перепробовали...но результатов не дало..на Delphi всё работает..


Время: 18:55.

Время: 18:55.
© OSzone.net 2001-