2009-08-28 4 views
2

У меня есть драйвер обнаженного минимум Erlang порта:Erlang: Указанный модуль не может быть найден

erl_driver_bridge.c ->erl_driver_bridge.dll

#define __WIN32__ 

#include "erl_driver.h" 

typedef struct { 
    ErlDrvPort port; 
} erl_driver_bridge_data; 

static ErlDrvData bridge_start(ErlDrvPort port, char *buff) { 
    erl_driver_bridge_data* d = 
     (erl_driver_bridge_data*)driver_alloc(sizeof(erl_driver_bridge_data)); 
    d->port = port; 
    return (ErlDrvData)d; 
} 

static void bridge_stop(ErlDrvData data) { 
    driver_free((char*)data); 
} 

static void bridge_output(ErlDrvData data, char *buff, int bufflen) { 
    erl_driver_bridge_data* d = (erl_driver_bridge_data*)data; 
} 

ErlDrvEntry erl_driver_bridge_entry = { 
    NULL,    /* F_PTR init, N/A */ 
    bridge_start,  /* L_PTR start, called when port is opened */ 
    bridge_stop,  /* F_PTR stop, called when port is closed */ 
    bridge_output,  /* F_PTR output, called when erlang has sent */ 
    NULL,    /* F_PTR ready_input */ 
    NULL,    /* F_PTR ready_output */ 
    "erl_driver_bridge", /* char *driver_name, the argument to open_port */ 
    NULL,    /* F_PTR finish, called when unloaded */ 
    NULL,    /* Not used */ 
    NULL,    /* F_PTR control, port_command callback */ 
    NULL,    /* F_PTR timeout, reserved */ 
    NULL,    /* F_PTR outputv, reserved */ 
    NULL,    /* F_PTR ready_async */ 
    NULL,    /* F_PTR flush */ 
    NULL,    /* F_PTR call */ 
    NULL,    /* F_PTR event */ 
    ERL_DRV_EXTENDED_MARKER, 
    ERL_DRV_EXTENDED_MAJOR_VERSION, 
    ERL_DRV_EXTENDED_MINOR_VERSION, 
    0, 
    NULL,    /* Reserved -- Used by emulator internally */ 
    NULL,    /* F_PTR process_exit */ 
}; 

DRIVER_INIT(erl_driver_bridge) { 
    return &erl_driver_bridge_entry; 
} 

Тогда я стараюсь чтобы загрузить его в Erlang:

case erl_ddll:load_driver(".", erl_driver_bridge) of 
    ok -> ok; 
    {error, Error} -> erl_ddll:format_error(Error) 
end. 

Который производит:

Указанный модуль не найден.

Я проверил, что драйвер существует в текущем каталоге и даже указан полный путь, но Erlang все еще не видит его. Есть идеи?

ответ

1

В Windows расширение файла должно быть ddl, а не dll?

+0

Вы правы, я пропустил эту часть документации. К сожалению, он все равно не загрузится. Хотя на этот раз код ошибки -136, а не -167, но format_error все еще возвращает «Указанный модуль не может быть найден». :( –

+1

Загрузите эту утилиту и используйте ее, чтобы попытаться загрузить файл - http://www.dependencywalker.com/ - он должен показать, какие другие файлы вы зависите, и действительно ли ваша библиотека может быть загружена или нет. найти из этого, что вам не хватает другой зависимой dll ... –

+0

Не хватало MSVCR90.dll, поэтому я скомпилирован с флагом/MT, и теперь Dependency Walker не сообщает об ошибках. Однако Erlang все еще отказывается его загрузить. –

0

Сравнение вашего с моим голым минимумом, которое я взломал некоторое время назад. Может помочь, а не могли бы помочь ...

  • Я также включил ei.h

  • Я объявил ErlDrvEntry erl_driver_bridge_entry статическую

1

Вы, вероятно, следует использовать 'файл: get_cwd', чтобы получить текущий рабочий каталог и добавьте следующий путь.

Также удобно, но, вероятно, не связано с вашим текущим вопросом: проверили ли вы путь кода, который использует эмулятор Erlang? Используйте функцию 'code: get_path' (http://www.erlang.org/doc/man/code.html), чтобы проверить путь поиска. Вы можете использовать «code: add_path» для удобного вставки путей.

Смежные вопросы