易语言引用getmodulefilename
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了易语言引用getmodulefilename相关的知识,希望对你有一定的参考价值。
引用这个的作用就是:比如我做个程序,编译出来后在随便一个文件上右键―打开方式―我的程序。当我的程序启动后取刚才那个文件的路径
三个参数hModule 整数型
一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄。如果该参数为NULL,
该函数返回该应用程序全路径。
lpFileName 文本型
指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的
nSize 整数型
装载到缓冲区lpFileName的最大字符数量
你可以定义三个变量,也可以定两个
文件路径(变量)用来存放lpFileName(完整路径)
函数用法:GetModuleFileName(,文件路径,255)‘第一个参数为空的时候,就是自己应用程序的全路径。
GetModuleFileName返回0为失败,可以用GetLastError打印错误。 参考技术A .版本 2
.程序集 窗口程序集1
.程序集变量 路径名, 文本型
.子程序 __启动窗口_首次激活
.局部变量 参数, 文本型, , "0"
取命令行 (参数)
.如果真 (取数组成员数 (参数) > 0)
路径名 = 参数 [1]
信息框 (路径名, 0, )
.如果真结束
-----------------------------------------------------
主要的就是 取命令行 () 命令 用的是数组 要注意
还有疑问请百度HI我本回答被提问者采纳
GetModuleFileName函数第2个参数是LPWSTR 类型,结果读出来的路径中间总有一个0
GetModuleFileName函数第2个参数是LPWSTR 类型,结果读出来的路径中间总有一个0,结果也得不到正确路径。怀疑是LPWSTR 类型所致。转成char型又报错。该怎么弄呢?
确切说,GetModuleFileName的定义是一个宏,在UNICODE版本下,GetModuleFileName等同于GetModuleFileNameW,在ANSI版本下等同于GetModuleFileNameA。
GetModuleFileNameA和GetModuleFileNameW的区别在于它们的字符串参数的“字符宽度”,这两个函数的原型如下:
DWORD WINAPI GetModuleFileNameA( HMODULE hModule,LPSTR
lpFilename, DWORD nSize );//ANSI版本,第二个参数是LPSTR,也就是char*。这意味着你需要向其传递的参数是char类型的字符串DWORD WINAPI GetModuleFileNameW( HMODULE hModule,
LPWSTR
lpFilename, DWORD nSize );//UNICODE版本,第二个参数是LPWSTR,也就是wchar_t*。这意味着你需要向其传递的参数是wchar_t类型的字符串。
如果你的代码预定义了宏“UNICODE”,那么在编译时,“GetModuleFileName”就会被替换成“GetModuleFileNameW”,否则就是“GetModuleFileNameA”。
同理,_tcsrchr也是一个宏,当预定义了“_UNICODE”宏时,它会在编译时替换为
wchar_t *wcsrchr(const wchar_t *str,
wchar_t c
); // C only
因为凡是涉及字符串的函数,几乎都有对应的ANSI和UNICODE版本,比如wcsrchr、strrchr、strcmp、wcscmp等等。在你的代码中对各个接口、函数的ANSI版本和UNICODE版本的使用应该始终保持一致,以避免出现错误。
而你的代码,首先明确使用了ANSI版本的接口GetModuleFileNameA,而其后又将ANSI字符串提交给UNICODE版本的wcsrchr使用,所以会出现错误。
另:关于char和wchar_t的区别想必你应该了解,wchar_t字符串中每一个字符都由两个字节组成,对于ascii表中的字符,都会在高位字节补0以补齐两个字节。字符a其ascii码为0x61,用char类型表示时其值为0x61,但是用wchar_t表示时,由于wchar_t为双字符,因此其值应是0x0061——在INTEL x86和x64架构的系统中,字节序列表示就成了“0x61 0x00”。
比如有字符串"abcdefg",当你用char类型表示这一串字符串时,C代码会这样写:
char aString[] = "abcdefg";它在内存中的存在形式将是这样的:
61 62 63 64 65 66 67 00 ; abcdefg.
如果用wchar_t去表示,C代码如下:
在内存中的存在形式就会变为这样:
61 00 62 00 63 00 64 00 65 00 66 00 67 00 00 00 ; a.b.c.d.e.f.g...
由于每个字符都要双字符表示,因此在此示例中wchar_t表示的字符串会多了一半的0。当你把wchar_t表示的字符串字节序列强行当作char*类型来处理时,就会出现意料之外的问题。
因此你的代码应该这样写:
GetModuleFileName( gDllModule, tszCfgFile, MAX_PATH);
_tcsrchr( tszCfgFile, _T('\\\\') )[1] = 0;//这样写是危险的,如果tszCfgFile并不包含\\\\,此行将导致崩溃。
参考技术A Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (Byval hModule As Long,Byval lpFileName As String,Byval nSize As Long) As Long
Private Sub Command1_Click()
Dim StrFileName As String * 128
GetModuleFileName 0,StrFileName,128
MsgBox StrFileName
End Sub追问
GetModuleFileNameA用这个函数后,紧接着_tcsrchr函数要转回LPWSTR,就退出了。
如下两行代码,不能共存啊。
GetModuleFileNameA(gDllModule, (LPSTR)sCfgFile, MAX_PATH);
(_tcsrchr((LPWSTR)sCfgFile, _T('\\')))[1] = 0;
你这不是VB啊,怎么问到VB板块来了
以上是关于易语言引用getmodulefilename的主要内容,如果未能解决你的问题,请参考以下文章