[求助]无语了,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();
}

《[求助]无语了,Fucking VC++6.0[Done]》有10个想法

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

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

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

    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

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

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

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

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

回复 zengxi 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据