Help DLL vs Excel Please!
все тот же поиск файлов (DLLка):
//MyDLL.cpp------------------------------------------------------------------------
#include <windows.h>
#include <io.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,
LPVOID lpReserved )
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:break;
case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH:break;
}
return TRUE;
}
long frst;
_finddata_t data;
char * _stdcall FFIND(char * FName)
{
frst = _findfirst(FName,&data);
if (frst != -1)
return data.name;
return NULL;
}
char * _stdcall NFIND()
{
return data.name;
}
bool _stdcall BoolFlag()
{
if ((frst != -1) && (_findnext(frst,&data) != -1))
return 1;
_findclose(frst);
return 0;
}
//------------------------------------------------------------------------
DLL запрашивается Excel-ем:
Private Declare Function FFIND Lib "D:\MyDLL\Debug\MyDLL.dll" _
(ByVal FName As String) As String
Private Declare Function NFIND Lib "D:\MyDLL\Debug\MyDLL.dll" _
() As String
Private Declare Function BoolFlag Lib "D:\MyDLL\Debug\MyDLL.dll" _
() As Boolean
Private Sub CommandButton1_Click()
Dim i
i = 4
With Worksheets("Лист1")
If .Cells(3, 2).Value <> "" Then
.Range(Cells(3, 2), Cells(200, 2)).Value = ""
End If
.Cells(3, 2).Value = FFIND(TextBox1.Text) ''Вывод первого найденного файла
''.Cells(5, 5).Value = BoolFlag()
While (BoolFlag() = 1) ''Пока Флаг не сброшен
.Cells(i, 2).Value = NFIND() ''Выводим следующий найденный файл
i = i + 1
Wend
End With
End Sub
-----------------------
Когда вводишь конкретный шаблон: D:\*.CFG
то CFGшки и выдает (если KERNEL32.DLL не выполняет
недопустимых ошибок :), что иногда бывает), а когда
вводишь D:\*.* выдает какую-то хрень:
.ист1
.heetChange
mheetChange
rheetChange
theetChange
pharaon.cfg
pixel.xls
pheetChange
pheetChange
aheetChange
Скажите, ошибка может где, или можно проще сделать?
Спасибо за ответы.
Может, можно без C обойтись?
Примерно так (адаптировано с http://www.mvps.org/vbnet/index.html?code/fileapi/folderenumbasic.htm):
Option Explicit
Public Declare Function FindFirstFile Lib "kernel32" _
Alias "FindFirstFileA" _
(ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" _
Alias "FindNextFileA" _
(ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindClose Lib "kernel32" _
(ByVal hFindFile As Long) As Long
Public Const MAX_PATH As Long = 260
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type
Public Sub Getfiles()
Dim WFD As WIN32_FIND_DATA
Dim hFile As Long
ReDim fArray(1) As String
Dim i As Integer
Dim found As Integer
hFile = FindFirstFile("D:\My Documents\*.doc" & Chr$(0), WFD)
If hFile = -1 Then Exit Sub
If (Trim(WFD.cFileName) <> ".") And (Trim(WFD.cFileName) <> "..") Then
fArray(1) = Trim(WFD.cFileName)
found = 1
WFD.cFileName = ""
End If
While FindNextFile(hFile, WFD)
If (Trim(WFD.cFileName) <> ".") And (Trim(WFD.cFileName) <> "..") Then
found = found + 1
ReDim Preserve fArray(found)
fArray(found) = Trim(WFD.cFileName)
WFD.cFileName = ""
End If
Wend
Call FindClose(hFile)
Debug.Print "****Results****"
For i = 1 To found
Debug.Print fArray(i)
Next i
Debug.Print "****End****"
End Sub
Возможно, код непричесан, но, вобщем, работает.
Может, можно без C обойтись?
Нет, у меня задание по С.
Но все равно большущее спасибо.
Я разобрался уже - это Эксель не хочет нормально данные строковые принимать, ему посимвольно надо видети ли.