以前之所以选择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();
}
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被更名为[email protected]@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啊,