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编译器:程序无法执行
请各位高手帮帮忙:

解决方案 »

  1.   

    致命错误,说明你那DLL有问题。从新写去吧,去C语言区找人问问
      

  2.   

    你最后一个参数不是数组么,怎么就传个1进去
    Private Sub Command1_Click()
    Dim mas As Long
    dim a(4) as long
    mas = Encrypt(1, 2, "filename", VarPtr(a(0)))
    Text1.Text = mas
      

  3.   

    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]);
      }
    能写出这样的代码, 你也真是强的可以.vb ide崩溃, 是因为你的c的dll里面调用了 exit(0)
      

  4.   

    pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
    你说的完全不对:
    1."Encrypt"这个函数能不能这样写?当然最终实现的目的是就要在VB里读出磁盘文件是的数据:
    2.VB这样才能识别这个函数:毕竟VC++写程序格式:
    3.这点向你讨教下:
      

  5.   

    第一:
    你的函数的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就崩溃了。我不知道哪没说明白, 你的这份代码到处是错误, 所以我建议你重新写代码, 
    这比你在你现在的代码上修改的难度要少的多。
      

  6.   

    pigsanddogs(我爱吃猪肉,但是长不胖,为什么??) 
    谢谢:您这么一说我长了不少知识:好的我会重新写完的
    当然以后也要向您请教问题: