|
调用C语言写个DLL,几句代码搞定:
- code = /**
- #include <windows.h>
-
- /*
- 入口函数,该函数可以有也可以没有。
-
- 入口函数会自动加锁以保证线性调用,要避免在DllMain内调用下列函数:
- 1、调用LoadLibrary或其他可能加载DLL的API函数( CreateProcess等 )
- 2、可能再次触发DllMain的函数,例如 CreateThread,ExitThread
- 3、GetModuleFileName, GetModuleHandle 等其他可能触发系统锁的API函数
- 总之在DllMain最好不要调用API函数.
- */
- int __stdcall DllMain(void * hinstDLL, unsigned long fdwReason, void * lpvReserved) {
-
- if (fdwReason == 1/*DLL_PROCESS_ATTACH*/ ){
-
- }
- return 1;
- }
-
- //__declspec(dllexport) 声明导出函数
- __declspec(dllexport) int Msgbox( const char * str )
- {
- MessageBox( 0,str,"C语言DLL组件",MB_OK);
- return 0;
- }
- **/
-
- import tcc;
- vm = tcc( );//创建TCC编译器
- vm.addLib( "user32","kernel32","gdi32" ) //引用库
- vm.output( "/bin.dll", code ) //编译C源码,生成DLL
- vm.close(); //收工
- //加载生成的DLL
- var dll = raw.loadDll( "/bin.dll",, "cdecl" );//第三个参数指定C语言调用约定:cdecl
- //声明API函数
- Msgbox = dll.api( "Msgbox","int(string str)");
- Msgbox( "C语言你好!" );
- //不声明也可以直接调用API函数,如下:
- dll.Msgbox( "C语言你好!" );
复制代码
调用VC++写个DLL,几句代码搞定:
- import vc6;
- import console;
- var vc = vc6( "/",, console.open() )
- //输入C++源码
- vc.cpp = /******
- #include <windows.h>
-
- struct TestInfo{
- int x;
- int y;
- BYTE name[256];
- };
-
- class CTestObject
- {
- public:
- //注意函数声明前加上virtual以支持aardio中的raw.interface
- virtual void getName(char *buffer,int len);
- virtual BOOL getInfo(TestInfo *pInfo);
- };
-
- void CTestObject::getName(char *buffer,int len){
- strcpy(buffer,"测试");
- }
-
- BOOL CTestObject::getInfo(TestInfo *pInfo){
- pInfo->x = 1;
- pInfo->y = 2;
- strcpy((char *)pInfo->name,"测试");
- return TRUE;
- }
-
- extern "C" __declspec(dllexport) CTestObject* __cdecl CreateTestObject() {
- return new CTestObject();
- }
-
- extern "C" __declspec(dllexport) void __cdecl DeleteTestObject( CTestObject* pTest) {
- delete pTest;
- }
- ******/
-
- /*
- vc.exec(
- "rc.exe /l 0x804 test.rc"
- )
- */
- //编译生成DLL
- vc.exec(
- 'cl *.cpp'
- ,'/W3' /*警告等级*/
- ,'/MD' /*使用多线程动态运行库*/
- ,'/O2 /Ot /EHsc' /*代码优化选项*/
- ,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"' /*定义常数和宏*/
- ,'/I"./INCLUDE"'/*指定头文件目录*/
- ,'kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib' /*导入库*/
- ,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86' /*后面是链接参数 */
- ,'/out:test.dll'/*输出文件名*/
- ,'/dll' /*输出DLL*/
- ,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"' /*指定库目录*/
- )
- var dll = raw.loadDll("test.dll",,"cdecl")
- var pTest = dll.CreateTestObject();
- import raw.interface;
- var testObject = raw.interface(
- topointer(pTest),
- class {
- pointer getName = "void(string &buffe,int len)";
- pointer getInfo = "bool(struct &pInfo)";
- },"thiscall" //注意调用约定为thiscall
- )
-
- console.log( testObject.getName(25,25) )
- var ret,info = testObject.getInfo({ int x;int y;BYTE name[256]})
- console.log( info.name )
- console.pause()
- dll.DeleteTestObject( pTest );
复制代码 |
|