Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Dll на VC++ и прога на Delphi


Автор: Ptica_Oz 14.3.2007, 13:16
есть длл на VC++. в правильности работы ф-ций я уверена (в виде ехе-ника они работали замечательно).подключаю ее к проге на делфи и прога запинаестя на winapi-ной ф-ции.

код длл:
Код

static DEVMODE  *pDevmode    = 0;
static const TCHAR    *PrinterName = 0;
boolean __stdcall ACADPrint(char *Path,
                        char * Color,
                        char * Printer,
                        char * Text,
                        int Scale)
{
    ...
    PrinterName = (TCHAR *)Printer;
         ...
         pDevmode = fetch_DEVMODE(hPrinter, PrinterName);
         ...
         if ( pDevmode )
    {
        free(pDevmode);
        pDevmode = 0;
    }
}
...
static DEVMODE *fetch_DEVMODE(HANDLE hPrinter, const TCHAR *pname)
{
DEVMODE    *pdm = 0;
    
    LONG n = DocumentProperties( 0,    // hWnd
        hPrinter,
        const_cast<TCHAR *>(pname),
        0,            // DEVMODE output
        0,            // DEVMODE input
        0 );            // mode
    
    DocumentProperties( 0,        // hWnd
        hPrinter,
        const_cast<TCHAR *>(pname),
        pdm,                // DEVMODE output
        0,                // DEVMODE Input
        DM_OUT_BUFFER )    // mode
    

    return pdm;
}


код проги на дефи:
Код

var
   path, Color, Printer : PChar;
   Scale : integer;
...
   f := ACADPrint(path, Color, Printer, '!!!', Scale);

вылетаю на первом вызове ф-ции DocumentProperties.
обращалась к спецам по делфе на этом форуме. они посоветовали в длл передавать PChar, что собственно я и делаю. но результата это не дало.
помогите разобраться...  smile 

Автор: _hunter 14.3.2007, 13:27
во-первых: делфийского кода маловато.
во-вторых: что мешает код отладить и найти ошибку?
в-третьих: не в тот раздел вопрос...

Добавлено @ 13:31 
unicode, кстати, часом не продефайнен?

Автор: Ptica_Oz 14.3.2007, 13:37
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
во-первых: делфийского кода маловато.

а больше там ничего интересного нет. маленькая формачка с которой считываются значения переменных, как надо преобразуются, и вызывается та самая единственная и не повторимая ф-ция длл-ки
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
во-вторых: что мешает код отладить и найти ошибку?

как?
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
в-третьих: не в тот раздел вопрос...

если считаете нужным переместите

Автор: _hunter 14.3.2007, 13:52
Цитата(Ptica_Oz @  14.3.2007,  13:37 Найти цитируемый пост)
а больше там ничего интересного нет

т.е. переменные не инициализируются?
Цитата(Ptica_Oz @  14.3.2007,  13:37 Найти цитируемый пост)
как?

открываем проект .dll-ки в студди; жмем F5; указываем путь к .exe-шнику

Автор: ama_kid 14.3.2007, 13:58
Цитата(Ptica_Oz @ 14.3.2007,  13:37)
а больше там ничего интересного нет.

Это вам кажется, что ничего интересного нет. Мне, к примеру, было бы интересно посмотреть, как происходит загрузка библиотеки (статически или динамически), как происходит получение адреса функции (через GetProcAddress или дефинишеном напрямую), какие в итоге значения получаются и многое другое....
Цитата
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
во-вторых: что мешает код отладить и найти ошибку?

как?

Обычным способом. Загрузить среду, где разрабатывалась Dll-ка, загрузить проект Dll и запустить его на отладку с указанием host-приложения, которое эту библиотеку будет подгружать (в данном случае - ваше приложение)...

Автор: Ptica_Oz 14.3.2007, 14:05
Цитата(ama_kid @  14.3.2007,  13:58 Найти цитируемый пост)
 Мне, к примеру, было бы интересно посмотреть, как происходит загрузка библиотеки (статически или динамически), как происходит получение адреса функции (через GetProcAddress или дефинишеном напрямую), какие в итоге значения получаются и многое другое....

ох, простите,  про это-то я и забыла...
Код

function ACADPrint (Path : PChar;
                            Color : PChar;
                            Printer : PChar;
                            Text : PChar;
                            Scale : Integer) : Boolean ;stdcall; external 'D:\TextStyle.dll';



а с отладкой ща попробую...

Автор: Любитель 14.3.2007, 15:12
Ptica_Oz, значения всех параметров какие? Откуда берутся?

Автор: Ptica_Oz 14.3.2007, 15:19
Любитель,  в делфях они берутся из формы и переводятся в тип PChar кроме одного, который имеет тип integer. в длл параметры типа char * и int.  или я не про то говорю?  smile 

Автор: Ptica_Oz 14.3.2007, 15:38
при отладке говорит:
Код

Unhandled exception at 0x1001fdbb in Loodsman.exe: 0xC0000005: Access violation reading location 0x1001fdbb.

Автор: Любитель 14.3.2007, 15:57
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
unicode, кстати, часом не продефайнен?

Кстати да. В студии анси или уникод?

Автор: _hunter 14.3.2007, 16:55
это в какой момент говорит? в функцию попадаеш?

Автор: Ptica_Oz 15.3.2007, 06:53
Цитата(_hunter @  14.3.2007,  16:55 Найти цитируемый пост)
это в какой момент говорит? в функцию попадаеш?

говорит когда первый раз пытаюсь выполнить DocumentProperties (т.е. в ф-цию fetch_DEVMODE попадаю)
в студии анси

Автор: dumb 15.3.2007, 07:41
Ptica_Oz,
так как падает на вызове, в который передается единственный("левый" хэндл обычно не приводит к падениям) параметр - имя, то, видимо, дело именно в уникодной сборке dll и твоих ловких приведениях типов -
Код

                        char * Printer,
...
    PrinterName = (TCHAR *)Printer;


Цитата(Ptica_Oz @  15.3.2007,  06:53 Найти цитируемый пост)
в студии анси

если в проекте dll анси-строки, то это уже мистика какая-то... возможно, для прояснения ситуации тебе будет проще выложить exe+dll где-нибудь?

Автор: _hunter 15.3.2007, 11:54
в чем проблема легко проверить: вместо "const_cast<TCHAR *>(pname)" пишем имя принтера и пробуем вызвать так.
зачем, кстати, передавать TCHAR*, если приходит char*? зачем передавать const TCHAR*, если потом идет каст к TCHAR*?

Автор: Ptica_Oz 15.3.2007, 12:12
Цитата(_hunter @  15.3.2007,  11:54 Найти цитируемый пост)
в чем проблема легко проверить: вместо "const_cast<TCHAR *>(pname)" пишем имя принтера и пробуем вызвать так.зачем, кстати, передавать TCHAR*, если приходит char*? зачем передавать const TCHAR*, если потом идет каст к TCHAR*?

честно говоря этот вызов я взяла из чужого кода и сильно не разбиралась (работало в ехе и ладно), потом пробовала шаманить с "const_cast<TCHAR *>(pname)" ничего не получилось. просто писать имя не пробовала, но попытаюсь...
сейчас решила пойти в обход: сделала вместо длл ехе и вызываю его с параметрами из делфей через CreateProcess. ща олаживаю, попозже напишу чем дело кончилось.

Автор: Ptica_Oz 19.3.2007, 13:11
итог таков: пришлось перелопатить все ф-ции для получения списка форматов принтера (в контексте этой проблемы я пользовалась win api DocumentProperties), отладила ехе (нашлось ещё несколько глюков с автоматизацией) и вызвала его из делфей. после того как отладила ехе конечно пробовала снова сделать длл, но результата это не дало  smile 

Автор: Любитель 21.3.2007, 15:17
Может выложишь код? Проще будет мне кажется.

Автор: Ptica_Oz 23.3.2007, 11:45
Цитата(Любитель @  21.3.2007,  15:17 Найти цитируемый пост)
Может выложишь код?

а где это лучше сделать и как?

Автор: _hunter 23.3.2007, 11:56
да хоть на rapidshare.de...

Автор: Ptica_Oz 26.3.2007, 14:42
эх, я бы с радостью выложила, хочется ведь узнать в чем дело, да начальство не рекомендует  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)