[求助]无语了,Fucking VC++6.0[Done]

以前之所以选择BCB,就因为那VC++6.0看来确实面目可憎,外加那Fucking MFC…
但那怨念的BCB居然和IBM一个最新驱动冲突,而鄙人又是一个可耻的追求小版本号的淫,于是乎…

调了半天,下面的代码还是不对,GetProcAddress始终返回0,而hmod根据调试,应该取得了正确的值
唉,还望各位达人,帮助小弟- -

/*
Foobar.exe
*/
#include <stdio.h>
#include <windows.h>
__declspec(dllexport) int Mom()
{
printf("Fuck VC++n");
}
int main()
{
HMODULE hmod;
typedef int (* FOO)();
FOO foo;
hmod = LoadLibrary("Foobar.exe");
if(hmod != NULL)
{
foo = (FOO)GetProcAddress(hmod, "Mom");
return -1;
}
if(foo)
foo();
}

 

Comments: 10

Leave a reply »

 
 
 

ah V C++ 当年研究了半天都毫无结果的痛苦语言
还是喜欢pascal哦 (老古董)

还有,为什么你的网站上面的歌曲,无论是下载还是视听,都是断断续续还有mpeg rendering errors?我的系统是win XP sp2 (tablet Edition), 播放器是WMP 10和foobar

 

我网站上的歌曲….- -

 

你为什么不把那个export单独做一个dll试一下呢…

 

在楠楠的帮助下,花了一个中午的时间,这个问题终于搞清楚了,特总结如下:

DLL导出有两种方式,一种是__declspec(dllexport)方式,一种是.def文件方式:

采用第一种方式时,如果你的dll是给VC++用户使用,则只需向用户提供.lib文件,由他们静态链入就行了,但是如果您的DLL是供VB,BCB,DELPHI用户使用,则比较麻烦了。
因为由于C++的类间重载机制,使得不同的类中可能导出同名的函数,所以要对函数进行内部的编码,以区分不同的同名函数。因此,必须先使用
dumpbin /exports *.dll察看导出的函数更名后的名称,
例如前面的例子中,mom被更名为?mom@@YAHXZ,在GetProcAddress时必须使用此名称才能载入,否则GetLastError会显示“无法找到程序”

如果使用第二种方式,则函数会自动编号,所以使用编号进行访问,确保不会重复,例如
EXPORTS
mom @1

当然还有一种折中的方式,那就是如果你确保不会有类间的同名重载,你可以使用extern “C”才用C方式,关掉C++对函数名的重新命名,因此可以使用原名对函数进行GetProcAddress

 

我只是觉得你的测试程序自己export又自己调用很是诡异…

def文件那个方法不错, 我用的就是这一种.

 

extern c才是王道么。。。
通用牙。。

 

有时候extern C会冲突的…比如上次我在用G.729的codec时就跟ILBC的codec函数名冲突之.

 

用 def方便啊。
GetProcAddress在pascal里面用过。。也遇到过不少问题

 

确实,第一种太诡异了一点,呵呵…

 

昏,是不是不会用VC啊,

 

Leave a Reply

 
(will not be published)
 
 
Comment
 
 

 

无觅相关文章插件,快速提升流量