这个问题是为啦使VB调用VC里的DLL的函数需要有DEF文件,有DEF文件VB才知道怎么调用函数的,不然是没有办法找到函数的在你的VC工程里加一个DEF文件
在里面写上
LIBRARY    yourdllname.dll
DESCRIPTION   '(c) 2001 description '
EXPORTS
          callreadvar @1  PRIVATE就行啦

解决方案 »

  1.   

    看不懂……我不懂VB……
    但是有两点:
    1。既然你用MessageBox可以,那肯定不是楼上所说的问题;
    2。你的callreadvar()读出的a、b、c没有返回给调用程序啊?那VB中的a、b、c是从哪里来的啊?当然,你用MessageBox肯定不会存在这个问题。
    我真的不懂VB……呵呵,说错了别见怪。
      

  2.   

    你的VB里的a,b,c没有声明(VB允许不声明变量直接使用)
    如果我没猜错的话,你认为VC里的a,b,c变量直接在vb可以应用,这是错误的。新添一个取值的倒出函数
    extern "C"  _declspec(dllexport) int WINAPI vcGetValue(int nID)
    {
       switch(nID)
       {
         case 1:
           return a;
         case 2:
           return b;
         case 3:
           return c;
       }
    }
    同时callreadvar里的int a,b,c;放到函数外,声明为全局变量
    然后VB里声明
    Declare Function vcGetValue Lib "E:\vc\FILE-INPUT\cdll\Debug\cdll.dll" (byVal nID as Long) as Long  '注意一定要用long型
    调用时可以如下
    Call callreadvar
    Text1.Text = vcGetValue(1)
    Text2.Text = vcGetValue(2)
    Text3.Text = vcGetValue(3)
    To:wyzegg(蛋)  使用extern "C"  _declspec(dllexport)时是不需要DEF文件的
      

  3.   

    首先谢谢各位大侠回复!
    让我试试benbensan(笨笨三)的方法(在网吧中上网,还得回去试,呵呵)
    问题解决后一定给分,我不会对不起兄弟的!!!
      

  4.   

    which ".h" file in vc contains the declaration "switch"?
    vc just can't recognize "switch" ???????!!!!!!!!
    help! please~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      

  5.   

    benbensan(笨笨三)及路过各位大侠,给俺指条路吧!
    多谢!
      

  6.   

    Text1.Text = Str(a)
    Text2.Text = Str(b)
    Text3.Text = Str(c)你的 a,b,c 在哪定义的??
    不会是在 DLL 中的  int a,b,c; 吧?
    那可是局域变量啊!
      

  7.   

    请把你修改后的代码和编译的错误写上来,看不明白你的switch是什么意思
      

  8.   

    benbensan(笨笨三)大侠,非常感谢!(另外,switch是其他原因,对不起)
    VB模块文件:
    Option ExplicitDeclare Sub callreadvar Lib "E:\pma-prg\vc\FILE-INPUT\cdll\Debug\cdll.dll" ()Declare Function VcGetValue Lib "E:\pma-prg\vc\FILE-INPUT\cdll\Debug\cdll.dll" (ByVal nID As Long) As Long
    VB窗体文件:
    Private Sub Command1_Click()
    Call callreadvar
    Text1.Text = Str(VcGetValue(1))
    Text2.Text = Str(VcGetValue(2))
    Text3.Text = Str(VcGetValue(3))
    End SubVC源文件:
    #include "stdafx.h"
    #include "cdll.h"
    #include <stdio.h>
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
       
        return TRUE;
    }int a,b,c;__declspec(dllexport) void callreadvar()
    { printf("hello \n");    FILE *fp;
            fp=fopen("E:\\tem\\test1.txt","r"); //文件中:1 2 3
        if(fp==NULL)
          
          printf("file not found.");
        else
        {
          
          printf("file opened ok! \n");      fscanf(fp,"%d %d %d", &a,&b,&c);      //cout<<a<<b<<c;
          printf("%d,%d,%d", a,b,c);
          
          fclose(fp);
        }
        //return(0);
    }__declspec(dllexport) int WINAPI VcGetValue (int nID)
    {

    switch (nID)
    {
    case 1:
    return a;
    case 2:
    return b;
    case 3:
    return c;
    }}
    VC头文件:
    extern "C"{
    __declspec(dllexport) void callreadvar();_declspec(dllexport) int WINAPI VcGetValue(int nID);
    }运行后,点击VB中按钮,出现错误信息:
    实时错误 ‘453’找不到DLL入口点 VcGetValue in
    E:\pma-prg\vc\FILE-INPUT\cdll\Debug\cdll.dll
    多谢帮助!问题解决后分数必奉上! 
      

  9.   

    请把_declspec(dllexport) int WINAPI VcGetValue(int nID);的WINAPI去掉即可
      

  10.   

    对不起,上一条发言错了,调用约定必须用_stdcall,因此请按照如下改
    1、源文件中改为 int WINAPI VcGetValue (int nID)
    2、头文件中改为
    extern "C"{
    __declspec(dllexport) void callreadvar();int WINAPI VcGetValue(int nID);
    }
    3、向工程中添加一个cdll.def文件,内容如下
     EXPORTS
    VcGetValue
    4、建议你把callreadvar也采用.def导出的方式,因为如果你带参数或者返回值,则必须采用stdcall调用约定,那么必须加WINAPI,加了他后,编译的时候倒出函数名字会别改变,一般会改为 _名字@数字,不过在这里,你可以不改,只改前三步即可
      

  11.   

    你可以用Visual Studio 的工具里的DEPENDS.exe打开你的Dll文件来察看倒出函数的名称,便于你查找函数是否倒出,或者名字是否被改变,Win98下的快速察看也可以看Dll得到出情况