C代码:
Cipher.cpp
#include<windows.h>
#include<stdio.h>
#include "stdafx.h"
#define CIPHER_API __declspec(dllexport)
//VB默认调用方式则为__stdcall
//__declspec(dllexport) int __stdcall Encrypt();
//声明我的函数
CIPHER_API int __stdcall Encrypt( int p, int k ,char file,int t[] );//DLL入口函数
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//我的函数
int __stdcall Encrypt(int p, int k,char * file,int t[])
{
FILE * fp;
int i, n2= 5, y[5];
if ((fp=fopen("filename","rb+"))==NULL) // 新建并打开一个二进制文件,并测试是否成功
{
printf("Can' t open the %s\n");
exit(0);
}
//fp=fopen(filename,"rb"); // 以读方式打开二进制文件
n2=getw(fp); // 从二进制文件读取一个整数
for (i=0; i<n2; i++)
{
y[i]=getw(fp); // 从文件读取一个整数赋给y数组元素
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
return(y[i]);
}
/*int __stdcall Encrypt(int p, int k,char * filename)
{
FILE * fp;
int a,b;
int temp1=0,temp2=0;
fp=fopen("filename","rb+");
if(fp==NULL) { exit(0);} fscanf(fp,"%d",&b);
fscanf(fp,"%d",&a);
temp1=p+a;
temp2=k+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1); }*///退出函数
int __stdcall WEP ( int SystemExit)
{
return(1);
}
Cipher.defLIBRARY Cipher
DESCRIPTION 'Cipher.dll'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS Encrypt
Encrypt @1
WEP @2 stdafx.h
#include<stdio.h>extern "C"
{
int __stdcall stdafx(int x,int y,char *file);
}
Cipher.dll
#include<windows.h>
#include<stdio.h>
#include "stdafx.h"
#define CIPHER_API __declspec(dllexport)
//VB默认调用方式则为__stdcall
//__declspec(dllexport) int __stdcall Encrypt();
//声明我的函数
CIPHER_API int __stdcall Encrypt( int p, int k ,char file,int t[] );//DLL入口函数
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//我的函数
int __stdcall Encrypt(int p, int k,char * file,int t[])
{
FILE * fp;
int i, n2= 5, y[5];
if ((fp=fopen("filename","rb+"))==NULL) // 新建并打开一个二进制文件,并测试是否成功
{
printf("Can' t open the %s\n");
exit(0);
}
//fp=fopen(filename,"rb"); // 以读方式打开二进制文件
n2=getw(fp); // 从二进制文件读取一个整数
for (i=0; i<n2; i++)
{
y[i]=getw(fp); // 从文件读取一个整数赋给y数组元素
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
return(y[i]);
}
/*int __stdcall Encrypt(int p, int k,char * filename)
{
FILE * fp;
int a,b;
int temp1=0,temp2=0;
fp=fopen("filename","rb+");
if(fp==NULL) { exit(0);} fscanf(fp,"%d",&b);
fscanf(fp,"%d",&a);
temp1=p+a;
temp2=k+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1); }*///退出函数
int __stdcall WEP ( int SystemExit)
{
return(1);
} LIBRARY Cipher
DESCRIPTION 'Cipher.dll'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS Encrypt
Encrypt @1
WEP @2 C读出文件(在工程里)
#include "stdio.h"
main( )
{ FILE *fp;
int i,n2=5,y[5];
if ((fp=fopen("filename","rb+"))==NULL)
{ printf("Can' t open the %s\n");
exit(0);
}
n2=getw(fp);
for (i=0; i<n2; i++)
{ y[i]=getw(fp);
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
}
VB代码:
Private Declare Function Encrypt Lib "C:\WINDOWS\system32\Cipher.dll" (ByVal p As Long, ByVal k As Long, ByVal file As String, ByVal h As Long) As LongPrivate Sub Command1_Click()
Dim mas As Long
mas = Encrypt(1, 2, "filename", 1)
Text1.Text = mas
问题是:AIP在调用"Encrypt "时候自动退出VB编译器:程序无法执行
请各位高手帮帮忙:
Cipher.cpp
#include<windows.h>
#include<stdio.h>
#include "stdafx.h"
#define CIPHER_API __declspec(dllexport)
//VB默认调用方式则为__stdcall
//__declspec(dllexport) int __stdcall Encrypt();
//声明我的函数
CIPHER_API int __stdcall Encrypt( int p, int k ,char file,int t[] );//DLL入口函数
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//我的函数
int __stdcall Encrypt(int p, int k,char * file,int t[])
{
FILE * fp;
int i, n2= 5, y[5];
if ((fp=fopen("filename","rb+"))==NULL) // 新建并打开一个二进制文件,并测试是否成功
{
printf("Can' t open the %s\n");
exit(0);
}
//fp=fopen(filename,"rb"); // 以读方式打开二进制文件
n2=getw(fp); // 从二进制文件读取一个整数
for (i=0; i<n2; i++)
{
y[i]=getw(fp); // 从文件读取一个整数赋给y数组元素
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
return(y[i]);
}
/*int __stdcall Encrypt(int p, int k,char * filename)
{
FILE * fp;
int a,b;
int temp1=0,temp2=0;
fp=fopen("filename","rb+");
if(fp==NULL) { exit(0);} fscanf(fp,"%d",&b);
fscanf(fp,"%d",&a);
temp1=p+a;
temp2=k+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1); }*///退出函数
int __stdcall WEP ( int SystemExit)
{
return(1);
}
Cipher.defLIBRARY Cipher
DESCRIPTION 'Cipher.dll'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS Encrypt
Encrypt @1
WEP @2 stdafx.h
#include<stdio.h>extern "C"
{
int __stdcall stdafx(int x,int y,char *file);
}
Cipher.dll
#include<windows.h>
#include<stdio.h>
#include "stdafx.h"
#define CIPHER_API __declspec(dllexport)
//VB默认调用方式则为__stdcall
//__declspec(dllexport) int __stdcall Encrypt();
//声明我的函数
CIPHER_API int __stdcall Encrypt( int p, int k ,char file,int t[] );//DLL入口函数
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//我的函数
int __stdcall Encrypt(int p, int k,char * file,int t[])
{
FILE * fp;
int i, n2= 5, y[5];
if ((fp=fopen("filename","rb+"))==NULL) // 新建并打开一个二进制文件,并测试是否成功
{
printf("Can' t open the %s\n");
exit(0);
}
//fp=fopen(filename,"rb"); // 以读方式打开二进制文件
n2=getw(fp); // 从二进制文件读取一个整数
for (i=0; i<n2; i++)
{
y[i]=getw(fp); // 从文件读取一个整数赋给y数组元素
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
return(y[i]);
}
/*int __stdcall Encrypt(int p, int k,char * filename)
{
FILE * fp;
int a,b;
int temp1=0,temp2=0;
fp=fopen("filename","rb+");
if(fp==NULL) { exit(0);} fscanf(fp,"%d",&b);
fscanf(fp,"%d",&a);
temp1=p+a;
temp2=k+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1); }*///退出函数
int __stdcall WEP ( int SystemExit)
{
return(1);
} LIBRARY Cipher
DESCRIPTION 'Cipher.dll'
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
EXPORTS Encrypt
Encrypt @1
WEP @2 C读出文件(在工程里)
#include "stdio.h"
main( )
{ FILE *fp;
int i,n2=5,y[5];
if ((fp=fopen("filename","rb+"))==NULL)
{ printf("Can' t open the %s\n");
exit(0);
}
n2=getw(fp);
for (i=0; i<n2; i++)
{ y[i]=getw(fp);
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
}
VB代码:
Private Declare Function Encrypt Lib "C:\WINDOWS\system32\Cipher.dll" (ByVal p As Long, ByVal k As Long, ByVal file As String, ByVal h As Long) As LongPrivate Sub Command1_Click()
Dim mas As Long
mas = Encrypt(1, 2, "filename", 1)
Text1.Text = mas
问题是:AIP在调用"Encrypt "时候自动退出VB编译器:程序无法执行
请各位高手帮帮忙:
Private Sub Command1_Click()
Dim mas As Long
dim a(4) as long
mas = Encrypt(1, 2, "filename", VarPtr(a(0)))
Text1.Text = mas
{
FILE * fp;
int i, n2= 5, y[5];
if ((fp=fopen("filename","rb+"))==NULL) // 新建并打开一个二进制文件,并测试是否成功
{
printf("Can' t open the %s\n");
exit(0);
}
//fp=fopen(filename,"rb"); // 以读方式打开二进制文件
n2=getw(fp); // 从二进制文件读取一个整数
for (i=0; i<n2; i++)
{
y[i]=getw(fp); // 从文件读取一个整数赋给y数组元素
printf("%d ",y[i]);
}
printf("\n");
fclose(fp);
return(y[i]);
}
能写出这样的代码, 你也真是强的可以.vb ide崩溃, 是因为你的c的dll里面调用了 exit(0)
你说的完全不对:
1."Encrypt"这个函数能不能这样写?当然最终实现的目的是就要在VB里读出磁盘文件是的数据:
2.VB这样才能识别这个函数:毕竟VC++写程序格式:
3.这点向你讨教下:
你的函数的4个参数没有一个在函数里面使用了。 (这是我佩服你的第一点)
所以只要栈平了(显然你用了stdcall,并且你传了16个字节。 并且c的函数的参数也是16个字节), 所以栈平了, 也就意味着你随便在vb传什么, 都不能影想到c的dll的执行。
第二:
if ((fp=fopen("filename","rb+"))==NULL) // 新建并打开一个二进制文件,并测试是否成功
这不是新建,而是打开, 用r开头的,文件必须存在, b表示2进制,+表示我还能写。
你这里肯定写错代码了。这一点好好温习下基本操作。
当然,如果你的文件名因为是传过来的参数, 但你这里指定了, 我的文件名就叫
filename, 显然, 你电脑上没这个文件, 那么fopen就失败。 返回null,
接着你执行了异常恐怖的一步。
exit(0);
exit是c++ runtime库函数, 他会做一些这样的事: 析构全局对象,清除c runtime信息,
最后调用ExitProcess(0)你的vb的程序调用了dll的函数, dll的函数调用了exit, 最后调用了exitprocess。
那么: 你的vb程序讲被关闭, 任何调用exitprocess的进程都会被关闭。你在ide中按f5运行程序, vb并没有编译一个exe, 然后创建这个exe的进程。
而是自己解释代码执行, 那么调用exitprocess的进程就是vb6.exe 所以你的ide就崩溃了。我不知道哪没说明白, 你的这份代码到处是错误, 所以我建议你重新写代码,
这比你在你现在的代码上修改的难度要少的多。
谢谢:您这么一说我长了不少知识:好的我会重新写完的
当然以后也要向您请教问题: