荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店