在我的DLL中有如下两个函数:
bool InitDog(WORD inp1,WORD inp2,WORD inp3,WORD inp4);
int WriteData(int modelno,int modelpwd,int day1,int day2,int com1,int com2,int userid);
用外部程序调这2个DLL函数,结果InitDog没问题,但若调WriteData就编译报错:
CallDogDllDlg.obj : error LNK2001: unresolved external symbol "int __cdecl WriteData(int,int,int,int,int,int,int)" (?WriteData@@YAHHHHHHHH@Z)
Debug/CallDogDll.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
该怎么办?
我试过加extern "C" __declspec(dllexport)不行,
加LIB也不行,求解!

解决方案 »

  1.   

    肯定没问题。
    你的InitDog能用,WriteData也应该能用。
    检查一下,是不是漏了什么?LIB,H,DLL文件没更新(编译过后没COPY到工程目录下)???
      

  2.   

    你先用工具dependencies(VC自带)看看你的DLL是不是引出了两个函数???
      

  3.   

    改了函数名还是不行啊!5555555555
    比较了能用的InitDog和不能用的WriteData发现:WriteData里用到了sprintf和strcpy
    会是这2个函数的问题吗?
      

  4.   

    请教怎么用dependencies?谢谢老大啊!
      

  5.   

    开始-》VC-》vctools-》DEPENDS
    打开你的DLL就可以看到所有引出的函数了。
      

  6.   

    若引出了是否是在DEPENDS右侧上部的窗体中会显示呢?要是这样,就应该是没引出了。
      

  7.   

    是只引出了一个:InitDog。另一个没引出,是为什么呢?
      

  8.   

    右侧上部的窗体中会显示的是引入的。
    。。下部引出的。没有显示,就是你没引出,
    你的DLL写的有点问题,
    看看所有写InitDog和writedata的地方有什么不同,我想你应该知道怎么做,因为InitDog已经引出了。
      

  9.   

    .h 中:
    extern "C" __declspec(dllexport)
    bool InitDog(WORD inp1,WORD inp2,WORD inp3,WORD inp4);
    int WriteData(int modelno,int modelpwd,int day1,int day2,int com1,int com2,int userid);.cpp中 :(Rockey是另外厂家提供的OBJ中的函数)
    bool InitDog(WORD inp1,WORD inp2,WORD inp3,WORD inp4)
    {
    char cmd[] = "H=H^H, A=A*23, F=B*17, A=A+F, A=A+G, A=A<C, A=A^D, B=B^B, C=C^C, D=D^D";
    char cmd1[] = "A=A+B, A=A+C, A=A+D, A=A+E, A=A+F, A=A+G, A=A+H";
    char cmd2[] = "A=E|E, B=F|F, C=G|G, D=H|H"; p1=inp1;p2=inp2;p3=inp3;p4=inp4; retcode = Rockey(RY_FIND, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return false;
    } retcode = Rockey(RY_OPEN, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return false;
    } return true;
    }int qyWriteData(int modelno,int modelpwd,int day1,int day2,int com1,int com2,int userid)
    {
    p1 = 3;
    p2 = 15;
    char writestr[100]; sprintf(writestr,"%01X%06X%03X%03X%01X%01X",modelno,modelpwd,day1,day2,com1,com2); strcpy((char*)buffer, writestr); retcode = Rockey(RY_WRITE, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return retcode;
    } lp1=userid; retcode = Rockey(RY_WRITE_USERID, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return retcode;
    }
    return 0;
    }
    我不行了,大哥救我!
      

  10.   

    更正:上面贴的qyWriteData实际上在代码中写的是WriteData(跟.h中一样的)啊!
      

  11.   

    改动:
    .h 中:
    extern "C" __declspec(dllexport)
    bool WINAPI InitDog(WORD inp1,WORD inp2,WORD inp3,WORD inp4);extern "C" __declspec(dllexport)
    int WINAPI WriteData(int modelno,int modelpwd,int day1,int day2,int com1,int com2,int userid);.cpp中 :(Rockey是另外厂家提供的OBJ中的函数)
    bool InitDog(WORD inp1,WORD inp2,WORD inp3,WORD inp4)
    {
    char cmd[] = "H=H^H, A=A*23, F=B*17, A=A+F, A=A+G, A=A<C, A=A^D, B=B^B, C=C^C, D=D^D";
    char cmd1[] = "A=A+B, A=A+C, A=A+D, A=A+E, A=A+F, A=A+G, A=A+H";
    char cmd2[] = "A=E|E, B=F|F, C=G|G, D=H|H"; p1=inp1;p2=inp2;p3=inp3;p4=inp4; retcode = Rockey(RY_FIND, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return false;
    } retcode = Rockey(RY_OPEN, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return false;
    } return true;
    }int WriteData(int modelno,int modelpwd,int day1,int day2,int com1,int com2,int userid)
    {
    p1 = 3;
    p2 = 15;
    char writestr[100]; sprintf(writestr,"%01X%06X%03X%03X%01X%01X",modelno,modelpwd,day1,day2,com1,com2); strcpy((char*)buffer, writestr); retcode = Rockey(RY_WRITE, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return retcode;
    } lp1=userid; retcode = Rockey(RY_WRITE_USERID, &handle, &lp1, &lp2, &p1, &p2, &p3, &p4, buffer);
    if (retcode)
    {
    return retcode;
    }
    return 0;
    }
      

  12.   

    忘了说在定义的时候也写上extern .....
      

  13.   

    附:一般格式:
    .h
    #ifdef __cplusplus
    extern "C" {
    #endif  /* __cplusplus */
          int WINAPI FUNCTIONNAME1(..);
          void WINAPI FUNCTIONANEM2(..);   
    #ifdef __cplusplus
    }
    #endif.cpp
    extern "C"
    int WINAPI FUNCTIONNAME1(....)
    {
    ...}extern "C"
    void  WINAPI FUNCTIONNAME2(...)
    {
    ...
    }并在DLL工程中加一个和工程名(DLL名)一样的DEF文件XXXX。DEF
    .def; xxxx.def : Declares the module parameters for the DLL.LIBRARY      "xxxx"
    DESCRIPTION  'xxxx Windows Dynamic Link Library'EXPORTS
        ; Explicit exports can go here
             FUNCTIONNAME1 @1
             FUNCTIONNAME2 @2