2012-02-19 44 views
1

在談到我的第一篇中使用的DLL:Mozilla use a C DLL with js-ctypes建立由Mozilla的JS-ctypes的

我試圖建立從一個Mozilla Firefox擴展使用的DLL。我創建了一個C代碼並使用GCC進行編譯。

下面是C語言代碼:

#include<stdio.h> 
int add(int a,int b) 
{ 
    return(a+b); 
} 

下面是彙編行:

gcc -c library.c 
gcc -shared -o library.dll library.o -Wl 

DLL將井編譯,我可以dllexp打開它,可以看到add()方法裸露。

的問題是,當我嘗試從我的分機使用它,我總是得到消息:錯誤:無法打開庫

這裏是我的JavaScript調用:

var libc = ctypes.open("C:\\WINDOWS\\system32\\user32.dll"); //OK 
var libc2 = ctypes.open("C:\\WINDOWS\\system32\\library.dll"); //KO 

看來這個DLL不能被Firefox打開,但我想知道爲什麼。我沒有看到任何關於構建用於Firefox擴展的DLL,似乎我們可以使用每個經典的DLL庫。

有什麼想法?謝謝

回答

1

如果你編譯這樣的庫,你得到的依賴關係msvcrt.dll可能無法在你的系統上解決(需要redistributable package),在我的工作正常。但您可以編譯庫沒有對CRT的依賴,你只需要定義DllMain自己:

#include<windows.h> 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    return TRUE; 
} 

int add(int a,int b) 
{ 
    return(a+b); 
} 

而鏈接步驟是這樣的:

gcc -shared -nostdlib -o library.dll library.o -Wl,[email protected] 

不能使用CRT功能,那麼 - 我找不到一種在Windows上用GCC靜態編譯運行時的方法(另一方面,Visual C++也沒問題)。

+0

這樣做,非常感謝,如果沒有您的幫助弗拉基米爾,我永遠無法做到這一點,這張票和以前的其他人! – frinux 2012-02-26 18:22:40

+0

更確切地說,只需要C文件中的聲明。編譯行與-nostdlib將阻止代碼運行kernel32函數 – frinux 2012-02-27 15:00:37