Услуги Сертификаты Новости Статьи База знаний Алгоритмы Портфолио Скачать Ссылки Поиск
Услуги arrow Новости arrow JS CTypes FireFox 3+ DLL C development
JS CTypes FireFox 3+ DLL C development Версия для печати Отправить на e-mail
28.02.2012

Разработка для JS CTypes FireFox 3+ DLL на языке C

Рассмотрим, как решить данную задачу.

1. Выбор компилятора

Сначала я взял компилятор Microsoft Visual C++ из среды разработки Visual Studio 2010. В результате, я получил рабочий код, но он не захотел работать на машинах, где не была установлена Microsoft Visual Studio. Из чего был сделан вывод, что студия наверняка при сборке использует ссылки на свои библиотеки, даже если тщательно в конфиге отключить всё что только возможно. В итоге, проект либо не собирался без этих ссылок, либо dll не работала на некоторых машинах. Конкретно у меня Firefox не хотел ее загружать на машине с Windows XP SP3, а постоянно выдавал ошибку "couldn't load the library". А также, эта dll с точно такой же ошибкой не хотела работать еще на одной машине с Windows 7 Prof 32bit.

Вторым компилятором стал G++ из пакета MinGw. Что и сыграло свою решающую роль.

2. Разработка кода библиотеки на языке C

В результате, был написан простенький код на С:

  1. #include <windows.h>
  2. #ifndef DLL_API_H
  3. #define DLL_API_H
  4. #ifdef MYDEF
  5. #define DLL_API __declspec(dllexport)
  6. #else
  7. #define DLL_API __declspec(dllimport)
  8. #endif
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. int DLL_API add(int a, int b)
  13. {
  14.     return(a+b);
  15. }
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif // DLL_API_H
  20. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  21. {
  22.  return TRUE;
  23. }

* This source code was highlighted with Source Code Highlighter.

Этот код сохраняем в файл MyLib.c 

В коде отключено декорирование имен функций, что позволит вызывать из JS функции по их оригинальному имени, без учета декорирования.

3. Компиляция и сборка DLL

> g++ -c -DMYDEF MyLib.c
> g++ -shared -nostdlib -o MyLib.dll MyLib.o -Wl,-e_DllMain@12

Компиляция и сборка библиотеки выполняется без привязки к MSVCRT.DLL. 

На выходе получим MyLib.dll.

Вызов DLL из кода JS

Components.utils.import("resource://gre/modules/ctypes.jsm");

/* Проверка x86 | x64 платформы */
var WinABI = ctypes.default_abi;
if (ctypes.size_t.size !== 8){ WinABI = ctypes.winapi_abi; }

AddonManager.getAddonByID(" Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script ", function(addon)
{
    var libcPath = addon.getResourceURI("components/MyLib.dll");

    if (libcPath instanceof Components.interfaces.nsIURI)
    {
        var libc = ctypes.open(libcPath.path);

        var libc = ctypes.open(libc);

        /* import a function */
        var puts = libc.declare("add", /* function name */
                  WinABI, /* call ABI */
                  ctypes.int32_t, /* return type */
                  ctypes.int32_t, /* argument type */
                  ctypes.int32_t /* argument type */
         );

         var ret = puts(1,2);

         alert("1+2="+ret);

    }
}


* This source code was highlighted with Source Code Highlighter.

В коде также выполняется проверка той платформы, на которой запускается код: x86 или x64.

В результате мы получили библиотеку, которая не зависит от наличия MSVCRT.DLL, не зависит от версии FireFox, и, что главное, ее можно будет без труда собрать под Linux.

Пример вызова кода JS был взят тут. Статья основана на данном примере.

PS: если Вам была полезна данная статья, поддержите наш ресурс, нажмите кнопочку "+1" вверху страницы. Спасибо!

Последнее обновление ( 06.03.2012 )
 
< Пред.   След. >