none
如何导出VC++ DLL函数? RRS feed

  • 问题

  •     作为VC新手,我表示压力很大,因为我第一次写DLL就没写成。我的DLL里面有两个函数,一个是DllMain,另一个是xprintf。DllMain代码如下:
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){
    	if(ul_reason_for_call==DLL_PROCESS_ATTACH){
    		printf("Loaded Successfully.\n");
    	}
     return TRUE;
    }
    
        xprintf代码如下:
    void xprintf(){
    	printf("Use Successfully.\n");
    }
    
        于是Compile、Build之后,得到一个dll:testdll2.dll。
        另外又写一个EXE,动态引用这个DLL。代码如下:
    #include <stdio.h>
    #include <windows.h>
    int main(){
    	HINSTANCE dllhandle;
    	FARPROC xprintf;
    	dllhandle=LoadLibrary("D:\\VC\\MyProjects\\testdll2\\Debug\\testdll2.dll");
    	if(dllhandle){
    		printf("dllhandle:%d\n\n",dllhandle);
    	}
    	else{
    		printf("Loaded Failed.\nError:%d\n",GetLastError());
    		return -1;
    	}
    	xprintf=GetProcAddress(dllhandle,"xprintf");
    	if(xprintf){
    		printf("Got Successfully.\nxprintf:%d\n\n",xprintf);
    	}
    	else{
    		printf("Got Failed.\nError:%d\n",GetLastError());
    		return -1;
    	}
    	FreeLibrary(dllhandle);
    	return 1;
    }
    
        编译连接该程序,得到load.exe,于cmd下运行,输出结果如下:
    Loaded Successfully.
    dllhandle:268435456
    Got Failed.
    Error:127
        就是说LoadLibrary成功了,但是GetProcAddress失败了,GetLastError返回127,就是“找不到指定的程序”。
        上网查了很多资料,很多人的情况都类似,却没有找到合适的解决办法。
        于是问朋友,朋友说我这是因为没有导出DLL函数。但由于朋友用的是汇编,只知道汇编下用export导出。
        求教各位高手,这种情况应该怎么办?

    • 已编辑 X.TK 2011年8月5日 2:31
    2011年8月4日 14:19

答案

  • 放松,放松

    __declspec(dllexport) void __cdecl xprintf(){
    	printf("Use Successfully.\n");
    }
    

    麻烦把正确答案设为解答。
    • 已标记为答案 X.TK 2011年8月5日 2:59
    2011年8月5日 2:41
    版主
  • 不知道你用的是哪个编译器。vc6.0有个depends工具。可以看你的dll里的函数名是否就是你的函数名。
    • 已标记为答案 X.TK 2011年8月5日 2:59
    2011年8月5日 2:26

全部回复

  • 不知道你用的是哪个编译器。vc6.0有个depends工具。可以看你的dll里的函数名是否就是你的函数名。
    • 已标记为答案 X.TK 2011年8月5日 2:59
    2011年8月5日 2:26
  • 感谢您的回复

    这个方法我之前已经尝试过,但是如上图所示,右边两个是空的,没法看到函数名。

    另外,我用的IDE是VC 6.0,DLL编写用的是VC,EXE的编写用的是Notepad++,编译用的是GCC。

    2011年8月5日 2:32
  • 放松,放松

    __declspec(dllexport) void __cdecl xprintf(){
    	printf("Use Successfully.\n");
    }
    

    麻烦把正确答案设为解答。
    • 已标记为答案 X.TK 2011年8月5日 2:59
    2011年8月5日 2:41
    版主
  • 感谢您的答复。

    我安装您给出的写法,重新编译链接了DLL,运行load.exe,结果却还是这样:

    看您给出的代码dllexport我相信是函数是导出了,但是为什么还是失败了呢?我只是获取ProcAddress,还没调用呢。

    就获取函数地址就返回了NULL。

    2011年8月5日 2:51
  • 呵呵我理解错您的意思了,我在编译链接之后再Depends看到了函数名:

    请问这是不是被修饰了呢?

    2011年8月5日 2:57
  • 再次感谢您的回复,该问题已经解决:

    2011年8月5日 2:59