看了很多類似的問題討論,但是仍然無法應用在我的情況,不知道是哪裡出了問題,我依照類似的指示將我VB的程式修改成如下,但執行時必當機,煩請各位替我想想如何解決,多謝...
Part1: VB的檔案
Public Declare Function InitializeDLL Lib "ReadData" () As Boolean
Public Declare Sub ReleaseDLL Lib "ReadData" ()
Public Declare Function get_CountOfDailyData Lib "ReadData" (ByVal stockno As String, ByVal revise As Boolean) As Integer
Public Declare Function TinaReadDailyData Lib "ReadData" (ByVal no As String, ByVal re As Boolean, o As Double, h As Double, l As Double, c As Double, v As Double, va As Double, d As Double, ByVal count As Integer, cer As Double) As Integer
Sub main()
If InitializeDLL <> False Then
Dim o(1 To 1000) As Double
Dim h(1 To 1000) As Double
Dim l(1 To 1000) As Double
Dim c(1 To 1000) As Double
Dim v(1 To 1000) As Double
Dim va(1 To 1000) As Double
Dim dates(1 To 1000) As Double
Dim cer(1 To 1000) As Double
ii = get_CountOfDailyData("2330", False)
'這一步可以執行
i = TinaReadDailyData("2330", False, o(1), h(1), l(1), c(1), v(1), va(1), dates(1), 1000, cer(1))
'上面這一行導致當機
ReleaseDLL
End If
End Sub
Part2: c語言的檔
void _export pascal TinaReadIndexDailyData(int indexno,double *open,double *high,
double *low,double *close,double *volume,double *okvalue,double *dates,int MaxCount)
{
int i,j,count;
int d,m,y,handle;
FILE *fp;
AnsiString file;
if(!IsOkay)
return;
file=(AnsiString)DataPath+(AnsiString)IndexTableNames[indexno];
fp=fopen(file.c_str(),"rb");
if(fp==NULL)
return;
handle=fileno(fp);
count=filelength(handle)/36;
if(MaxCount!=0 && MaxCount<count)
{
fseek(fp,(count-MaxCount)*36,0);
count=MaxCount;
}
for(i=0;i<count;i++)
{
fread(&j,sizeof(int),1,fp);
d=(unsigned short)(j-j/100*100);
m=(unsigned short)((j-j/10000*10000)/100);
y=(unsigned short)(1911+j/10000);
dates[i]=(double)TDateTime(y,m,d);
fread(&j,sizeof(int),1,fp);
open[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
high[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
low[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
close[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
okvalue[i]=(double)j;
fread(&j,sizeof(int),1,fp);
volume[i]=(double)j;
fread(&j,sizeof(int),1,fp);
fread(&j,sizeof(int),1,fp);
}
fclose(fp);
}
Part1: VB的檔案
Public Declare Function InitializeDLL Lib "ReadData" () As Boolean
Public Declare Sub ReleaseDLL Lib "ReadData" ()
Public Declare Function get_CountOfDailyData Lib "ReadData" (ByVal stockno As String, ByVal revise As Boolean) As Integer
Public Declare Function TinaReadDailyData Lib "ReadData" (ByVal no As String, ByVal re As Boolean, o As Double, h As Double, l As Double, c As Double, v As Double, va As Double, d As Double, ByVal count As Integer, cer As Double) As Integer
Sub main()
If InitializeDLL <> False Then
Dim o(1 To 1000) As Double
Dim h(1 To 1000) As Double
Dim l(1 To 1000) As Double
Dim c(1 To 1000) As Double
Dim v(1 To 1000) As Double
Dim va(1 To 1000) As Double
Dim dates(1 To 1000) As Double
Dim cer(1 To 1000) As Double
ii = get_CountOfDailyData("2330", False)
'這一步可以執行
i = TinaReadDailyData("2330", False, o(1), h(1), l(1), c(1), v(1), va(1), dates(1), 1000, cer(1))
'上面這一行導致當機
ReleaseDLL
End If
End Sub
Part2: c語言的檔
void _export pascal TinaReadIndexDailyData(int indexno,double *open,double *high,
double *low,double *close,double *volume,double *okvalue,double *dates,int MaxCount)
{
int i,j,count;
int d,m,y,handle;
FILE *fp;
AnsiString file;
if(!IsOkay)
return;
file=(AnsiString)DataPath+(AnsiString)IndexTableNames[indexno];
fp=fopen(file.c_str(),"rb");
if(fp==NULL)
return;
handle=fileno(fp);
count=filelength(handle)/36;
if(MaxCount!=0 && MaxCount<count)
{
fseek(fp,(count-MaxCount)*36,0);
count=MaxCount;
}
for(i=0;i<count;i++)
{
fread(&j,sizeof(int),1,fp);
d=(unsigned short)(j-j/100*100);
m=(unsigned short)((j-j/10000*10000)/100);
y=(unsigned short)(1911+j/10000);
dates[i]=(double)TDateTime(y,m,d);
fread(&j,sizeof(int),1,fp);
open[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
high[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
low[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
close[i]=(double)j/100.0;
fread(&j,sizeof(int),1,fp);
okvalue[i]=(double)j;
fread(&j,sizeof(int),1,fp);
volume[i]=(double)j;
fread(&j,sizeof(int),1,fp);
fread(&j,sizeof(int),1,fp);
}
fclose(fp);
}
全站熱搜
留言列表