这个问题是为啦使VB调用VC里的DLL的函数需要有DEF文件,有DEF文件VB才知道怎么调用函数的,不然是没有办法找到函数的在你的VC工程里加一个DEF文件
在里面写上
LIBRARY yourdllname.dll
DESCRIPTION '(c) 2001 description '
EXPORTS
callreadvar @1 PRIVATE就行啦
在里面写上
LIBRARY yourdllname.dll
DESCRIPTION '(c) 2001 description '
EXPORTS
callreadvar @1 PRIVATE就行啦
但是有两点:
1。既然你用MessageBox可以,那肯定不是楼上所说的问题;
2。你的callreadvar()读出的a、b、c没有返回给调用程序啊?那VB中的a、b、c是从哪里来的啊?当然,你用MessageBox肯定不会存在这个问题。
我真的不懂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文件的
让我试试benbensan(笨笨三)的方法(在网吧中上网,还得回去试,呵呵)
问题解决后一定给分,我不会对不起兄弟的!!!
vc just can't recognize "switch" ???????!!!!!!!!
help! please~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
多谢!
Text2.Text = Str(b)
Text3.Text = Str(c)你的 a,b,c 在哪定义的??
不会是在 DLL 中的 int a,b,c; 吧?
那可是局域变量啊!
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
多谢帮助!问题解决后分数必奉上!
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,加了他后,编译的时候倒出函数名字会别改变,一般会改为 _名字@数字,不过在这里,你可以不改,只改前三步即可