荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: scanf (carefully), 信区: SoftDev
标 题: [合集]请教一个Dll问题,请高手务必要指点迷津
发信站: 荔园晨风BBS站 (Wed Jun 2 14:29:43 2004), 站内信件
Adoking (Adoking) 于Wed May 19 13:36:33 2004提到:
在一个Dll中,我想用WinExec函数调用和这个Dll在同一个目录下的可执行文件,
请问怎么样可以做到?
ps:这个Dll是用VC编写的
oopilix (最后的日子) 于Thu May 20 11:13:40 2004提到:
从主程序的角度找到主程序的目录就知道了
Adoking (Adoking) 于Thu May 20 12:20:34 2004提到:
不是很明白你的意思
oopilix (最后的日子) 于Thu May 20 14:10:52 2004提到:
GetModuleFileName取得你的exe所在全目录,就可以
弄到你的子程序包的路径,你的dll直接调用这个目录即可
oopilix (最后的日子) 于Thu May 20 14:24:51 2004提到:
GetModuleFileName获得主程序
test.exe的路径 F:\\test\\test.exe
dll和另外一个exe放在 F:\\test\\dll\\下的t.dll,k.exe
t.dll只要获得F:\\test\\ 加上dll\\就行了。
在winexec里面直接调用 该F:\\test\\dll\\k.exe
Adoking (Adoking) 于Thu May 20 17:57:39 2004提到:
多谢oopilix的指点,但GetModuleFileName函数只能返回调用Dll的程序的路径,
而调用我的Dll的程序的路径不确定,所以这个函数不适用。
关于取得 Dll 当前路径,可以利用访问注册表的函数,找到Dll的注册信息,
即可得到Dll的路径。但就是要通过注册表,绕了一圈。不知道有没有办法可以像
exe一样直接获得。
oopilix (最后的日子) 于Thu May 20 18:34:34 2004提到:
一样适用。,你的dll怎么说都是由一个主程序调用的。
littlebao (爱拼才会赢) 于Thu May 20 19:12:03 2004提到:
一样,只要你把你的dll的模块的句柄传递给GetModuleFileName()就可以了
你可以用一个全局变量在进入点函数里保存模块的句柄。
Adoking (Adoking) 于Thu May 20 21:34:08 2004提到:
是一个主程序调用Dll,然后这个Dll运行另一个程序。
Adoking (Adoking) 于Thu May 20 21:36:07 2004提到:
请问怎么把Dll的模块句柄传给GetModuleFileName()?
littlebao (爱拼才会赢) 于Thu May 20 22:00:21 2004提到:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
g_hModule = hModule ;
return TRUE;
}
int your function:
GetModuleFileName((HMODULE)g_hModule , c , 80) ;
Adoking (Adoking) 于Thu May 20 22:16:53 2004提到:
我写的是 ATL COM 组件,没有DllMain函数。DllMain函数定义在obj文件里。
oopilix (最后的日子) 于Thu May 20 22:35:13 2004提到:
我知道你的意思。
oopilix (最后的日子) 于Thu May 20 22:36:14 2004提到:
你还是无法明白DLL和exe的差别。
我写的是 ATL COM 组件,没有DllMain函数。DllMain函数定义在obj文件里。
littlebao (爱拼才会赢) 于Thu May 20 23:07:18 2004提到:
??
你用向导建立atl com没有dllmain()?
只不过和dll不大一样
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID
/*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &LIBID_ATL2Lib);
g_hModule = (HMODULE)_Module.m_hInstResource ;
~~~~~~~~~~~~~~~~~~~~~~~~~~~
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
Adoking (Adoking) 于Fri May 21 17:55:20 2004提到:
多谢!问题已经解决了。
HMODULE g_hModule;
CString c;
g_hModule = (HMODULE)_Module.m_hInstResource;
GetModuleFileName(g_hModule , (LPTSTR)(LPCSTR)c , 255) ;
MessageBox(NULL, c, "debug", 1);
不过还是不能在ATL COM DLL里添加DllMain函数,会提示_DllMain@12已经在obj文件
里定义了。
??
你用向导建立atl com没有dllmain()?
只不过和dll不大一样
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID
/*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance, &LIBID_ATL2Lib);
g_hModule = (HMODULE)_Module.m_hInstResource ;
~~~~~~~~~~~~~~~~~~~~~~~~~~~
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
littlebao (爱拼才会赢) 于Fri May 21 18:24:05 2004提到:
如果你不需要在装载你的dll时处理信息,不要入口函数也罢。
用(LPCSTR)返回的地址是不可以改变的,
因为他的引用计数和长度等都没有改变
用(CStringData*)((CStringData*)(c.m_pchData)-1)就可以看到了
应该用GetBuffer(),最后ReleaseBuffer()
Adoking (Adoking) 于Fri May 21 18:36:16 2004提到:
呵呵,我正在想为什么不能改变c的内容,你就给出答案了,真及时。
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店