sssa2000以下是csdn里前人的回答! 问题: VB(主要是要原理及API函数),如何注册某种扩展名的文件,使其图标,打开方式,右键菜单与某个DLL或EXE关联起来。 右键菜单与DLL关联时,可以直接调用DLL中的函数(有参数)吗?我不是很懂,希望你们能懂我说的意思(类似于*.ZIP)!解答(1):下面的代码实现了注册文件扩展名、图标、打开方式,'声明以下常数和API函数 Private Const REG_SZ = 1 ' Unicode nul terminated string Private Const HKEY_CLASSES_ROOT = &H80000000 Private Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long 'cbData为字符串lpData的长度,一个汉字为两个字节 '使用示例,注册一种扩展名123的文件,缺省打开方式为用记事本 Private Sub Command1_Click() '注册文件类型.123为file123 RegSetValue HKEY_CLASSES_ROOT, ".123", REG_SZ, "file123", 7 '设置文件类型file123的图标与记事本的图标相同 RegSetValue HKEY_CLASSES_ROOT, "file123\DefaultIcon", REG_SZ, "c:\windows\notepad.exe,0", 24 '设置file123的缺省打开方式为read RegSetValue HKEY_CLASSES_ROOT, "file123\Shell", REG_SZ, "read", 4 '设置file123的右键菜单read显示的菜单项名称为"阅读.123文件" RegSetValue HKEY_CLASSES_ROOT, "file123\Shell\read", REG_SZ, "阅读.123文件", 12 '设置文件类型file123的缺省打开方式为用记事本打开 RegSetValue HKEY_CLASSES_ROOT, "file123\Shell\read\Command", REG_SZ, "c:\windows\notepad.exe ""%1""", 22 End Sub解答(2) rundll32命令的格式是这样的:rundll32 <dllname>,<entryName> <parameter line>给你写一下rundll32怎么工作的吧(示意代码):1,hModule = LoadLibrary("dllname") 2, procEntry = GetProcAddress(hModule,"<entryName>"); 3, if(!procEntry) return; 4,RUNDLL32PROC(procEntry)(hwnd,hInstance,paramLine,cmdShow); 5,return关键这个RUNDLL32PROC的函数类型,定义如下:void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); // for 32bit dll你按照这个原型声明函数并输出符号就可以被rundll32执行了。其中lpszCmdLine就是入口函数名称空格后面的字串。要注意CALLBACK声明表明函数的调用规则是stdcall。void说明不用返回值。hwnd,hinst何nCmdShow跟WinMain入口参数的含义相同。OK,have a try! Happy programming!
ltpao(啊炮) 回复于2001-8-21 21:47:00 得21分 还有两种方法 1、Dir("项目~1.doc"),返回的是长文件名 2、用API函数 Private Const MAX_PATH = 260 Private Const INVALID_HANDLE_VALUE = -1Private Type FileTime dwLowDateTime As Long dwHighDateTime As Long End TypePrivate 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 TypePrivate Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" ( _ ByVal lpFileName As String, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindClose Lib "kernel32" ( _ ByVal hFindFile As Long) As Long Private Function StripStringTail(psStr As Variant) As String On Error Resume Next Dim i As Long
If Trim(psStr & "") = "" Then Exit Function i = InStr(1, psStr, Chr(0), vbTextCompare) If i > 0 Then StripStringTail = Left(psStr, i - 1) Else StripStringTail = psStr End If End FunctionPrivate Function GetLongFileName(ByVal sFile As String) As String Dim llSearchHandle As Long Dim lFindDataStruct As WIN32_FIND_DATA llSearchHandle = FindFirstFile(sFile, lFindDataStruct) If llSearchHandle <> INVALID_HANDLE_VALUE Then GetLongFileName = StripStringTail(lFindDataStruct.cFileName) Call FindClose(llSearchHandle) End If End FunctionPrivate Sub Form_Load() Debug.Print GetLongFileName("f:\xceedb~1.exe") End Sub
问题:
VB(主要是要原理及API函数),如何注册某种扩展名的文件,使其图标,打开方式,右键菜单与某个DLL或EXE关联起来。
右键菜单与DLL关联时,可以直接调用DLL中的函数(有参数)吗?我不是很懂,希望你们能懂我说的意思(类似于*.ZIP)!解答(1):下面的代码实现了注册文件扩展名、图标、打开方式,'声明以下常数和API函数
Private Const REG_SZ = 1 ' Unicode nul terminated string
Private Const HKEY_CLASSES_ROOT = &H80000000
Private Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
'cbData为字符串lpData的长度,一个汉字为两个字节
'使用示例,注册一种扩展名123的文件,缺省打开方式为用记事本
Private Sub Command1_Click()
'注册文件类型.123为file123
RegSetValue HKEY_CLASSES_ROOT, ".123", REG_SZ, "file123", 7
'设置文件类型file123的图标与记事本的图标相同
RegSetValue HKEY_CLASSES_ROOT, "file123\DefaultIcon", REG_SZ, "c:\windows\notepad.exe,0", 24
'设置file123的缺省打开方式为read
RegSetValue HKEY_CLASSES_ROOT, "file123\Shell", REG_SZ, "read", 4
'设置file123的右键菜单read显示的菜单项名称为"阅读.123文件"
RegSetValue HKEY_CLASSES_ROOT, "file123\Shell\read", REG_SZ, "阅读.123文件", 12
'设置文件类型file123的缺省打开方式为用记事本打开
RegSetValue HKEY_CLASSES_ROOT, "file123\Shell\read\Command", REG_SZ, "c:\windows\notepad.exe ""%1""", 22
End Sub解答(2)
rundll32命令的格式是这样的:rundll32 <dllname>,<entryName> <parameter line>给你写一下rundll32怎么工作的吧(示意代码):1,hModule = LoadLibrary("dllname")
2, procEntry = GetProcAddress(hModule,"<entryName>");
3, if(!procEntry) return;
4,RUNDLL32PROC(procEntry)(hwnd,hInstance,paramLine,cmdShow);
5,return关键这个RUNDLL32PROC的函数类型,定义如下:void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); // for 32bit dll你按照这个原型声明函数并输出符号就可以被rundll32执行了。其中lpszCmdLine就是入口函数名称空格后面的字串。要注意CALLBACK声明表明函数的调用规则是stdcall。void说明不用返回值。hwnd,hinst何nCmdShow跟WinMain入口参数的含义相同。OK,have a try! Happy programming!
1、Dir("项目~1.doc"),返回的是长文件名
2、用API函数
Private Const MAX_PATH = 260
Private Const INVALID_HANDLE_VALUE = -1Private Type FileTime
dwLowDateTime As Long
dwHighDateTime As Long
End TypePrivate 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 TypePrivate Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" ( _
ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" ( _
ByVal hFindFile As Long) As Long
Private Function StripStringTail(psStr As Variant) As String
On Error Resume Next
Dim i As Long
If Trim(psStr & "") = "" Then Exit Function
i = InStr(1, psStr, Chr(0), vbTextCompare)
If i > 0 Then
StripStringTail = Left(psStr, i - 1)
Else
StripStringTail = psStr
End If
End FunctionPrivate Function GetLongFileName(ByVal sFile As String) As String
Dim llSearchHandle As Long
Dim lFindDataStruct As WIN32_FIND_DATA
llSearchHandle = FindFirstFile(sFile, lFindDataStruct)
If llSearchHandle <> INVALID_HANDLE_VALUE Then
GetLongFileName = StripStringTail(lFindDataStruct.cFileName)
Call FindClose(llSearchHandle)
End If
End FunctionPrivate Sub Form_Load()
Debug.Print GetLongFileName("f:\xceedb~1.exe")
End Sub
我最近也遇到了这个问题,你把Command()函数返回的字符串的前后两个引号去掉就可以了
例如:
你想打开C:\W.Jm
但是Command函数返回的是“C\W.Jm”多了两个引号,用程序去掉,就OK
Command这个函数应该返回的是长文件名阿??
把引号去掉后你再用GetLongFileName这个函数试试吧,不会有问题的。