我使用正则dll,代码如下:#define CF_API __declspec(dllexport)extern "C" CF_API BOOL PASCAL x()
{
         AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMyDlg dlg;
dlg.DoModal();
return 1;
}调用函数如下:
HINSTANCE hInst=LoadLibrary("fdll.dll");
if(hInst)
{
typedef BOOL (PASCAL *x)();
x t=NULL;
t=(x)GetProcAddress(hInst,"x");
//执行到这里的时候t总是为NULL;
if(t)
{
t();
}

//x();
}
FreeLibrary(hInst); 
但我无法得到函数的指针,请问是何原因?

解决方案 »

  1.   

    等了 一晚上啊,怎么怎么就没人回一下呢?难道我在这上面还犯了众怒啊,连个up的 人都没有,sigh!
      

  2.   

    首长要检查你的DLL是否正确EXPORT 了你指定的函数一般来说只有两种情况
    1、DLL 没有正确EXPORT
    2、定义的函数类型不对慢慢我以前也磁上这种情况 现在可没有了呵呵羡慕吧另: 我有源代码
      

  3.   

    我已经解决了这个问题,就是用export,问题是我的习惯是直接使用
    __declspec(dllexport)关键字,而我已经用了这个关键字,
    我觉得应该能够导出函数啊,为什么非要用export呢?
    难道正则dll只能export么?我在扩展dll中用得很好啊!
      

  4.   

    你说的不太清楚我不明白你具体地做法所以说不出什么了
    不过一般情况是这样的---每种编译器在编译时,对函数的命名的规则都不太一样
    所以,常常从外部看到的函数根本不是我们预先设想的
    对此你可以使用VC 自带的工具 DUMPBIN。EXE 来进行查询你的定义的函数是否正确EXPORT 若对了再检查调用库的规则是否正确。有些东西涉及到dLL的编写和PE结构中对DLL的IMPORT问题有兴趣可以自己看一看
      

  5.   

    不好意思,我没怎么看过专业的书,也没系统学过,或许说法有些让人不明白,都是按照自己的理解来的,我说的意思是我使用了直接在def文件中使用exports关键字来导出接口函数就行了,而在程序使用__declspec(dllexport)而没有在def文件中定义就是导不出来,不知道是为什么。
      

  6.   

    你说的这个问题我也遇到过,就是导出函数必须在.def文件中进行声名,不过我发现有时也不需要这样,比如在勾子中,我也一直不明白,所以帮你up一下,不过我发现最好声明一下
      

  7.   

    具体的细节我也想不起来了
    我记得好象是选择一个类型的工程 ,vc会自动为它生成一组编译连接的选项
    每一种工程是不完全一样的
    当用vc定义的宏时可以起到将FUN() EXPORT 的作用,实际上就是通知编译连接器这个FUN()是要输出的,编译连接时要保证它的名字不变并且对外可见而DEF文件是一种通用的方法任何编译器都会认识的。我一般都是将两者都写上的,省得出错呵呵
    不知道说清楚了没有呵呵