我想爲.dll注入目的編寫一個.dll庫。由於這個事實,它必須有一個名爲DllMain的例程,因爲這將被用作入口點。我認爲我的問題可能源自這樣一個事實,即我正在使用我編寫的靜態庫進行鏈接,該庫使用來自afxmt.h的線程和互斥體。因爲在某個位置,包含這個會導致鏈接器從mfcs100ud.lib鏈接,這顯然包含它自己的DllMain版本。不能通過「DllMain已定義」錯誤
這是給我找麻煩文件:
dllmain.cpp
#include "stdafx.h"
#include <stdio.h>
#include "NamedPipeLogger.h"
static CNamedPipeLogger m_PipeLogger("Log.txt");
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
}
這裏是dllmain.cpp被包括StdAfx.h文件。
stdafx.h中
#pragma once
#define _AFXDLL
#include <Afx.h>
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
這是我的錯誤消息:
錯誤32錯誤LNK2005:_DllMain @ 12 dllmain.obj d已經定義:\ XXXXX \ XXXXX \ xxxxxx \ mfcs100ud.lib(dllmodul.obj)
我剛剛搞砸了,因爲我無法更改名稱o f我的Dll入口點不是DllMain?
什麼項目的文件'dllmodul(e)'來自?很可能你的靜態庫包含一個DllMain並且是問題,而不是MFC。這種特殊的錯誤幾乎只會在你做一種項目並在稍後改變它時發生,或者以其他方式丟失一些設置或代碼;它不僅僅出現在新項目中,並且一旦找到源代碼就很容易解決。 – ssube 2012-02-07 21:48:03
我不確定dllmodul(e)是什麼意思,但是NamedPipeLogger.h文件的代碼來自我寫的一個靜態庫。它是一個連接到命名管道的線程日誌文件編寫器。它使用互斥體和線程,所以我必須包含,和。如何檢查我的靜態庫是否包含DllMain?我寫了這個東西,所以我知道我沒有聲明或者引用一個DllMain,所以我不知道它是如何來自這個庫的。 –
Ultratrunks
2012-02-07 21:56:12
你的靜態庫鏈接到MFC?如果是這樣,配置屬性中的「使用MFC」的設置是什麼? – 2012-02-07 21:59:53