الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أربط بين ملفين منفصلين

بدأه 852147 في 28 يوليو 2008 · 22 رد · 1,525 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أولا لدي مشكلة دوختني منذ أيام ممكن تساعدوني في حلها

لدي ملف رأسي c++ header file اسمه MyClassDevice.h

يحوي هذا الملفات تصريح كلاس ينشئ direct3d9 device بدون تعريف الدوال

كالتالي

LPDIRECT3D9		  Direct3D = NULL; 
LPDIRECT3DDEVICE9	Device = NULL; 

class MyDevice
{

protected:

	D3DPRESENT_PARAMETERS D3DPresent; 
	Direct3D; 
	Device; 
	D3DCAPS9	caps; 
	int SetDeviceType; 
	D3DDISPLAYMODE GetDisplayMode; 


public:
	VOID GetDeviceType ();
	VOID Render ();
	VOID CleanUp ();
	VOID CreateTheDevice ();

};

ولدي الملف MyClassDevice.ccp

يحوي تعريف دوال الكلاس كالتالي

#include "MyClassDevice.h"

VOID MyDevice::CleanUp() 
{
	....................
......................
......................
.....................

}
VOID MyDevice::Render() 
{
	.................................
...........................................
.............................................
}
VOID MyDevice::GetDeviceType() 
{

	....................................................
...............................
.......................................
.......................
}
VOID MyDevice::CreateTheDevice() 
{
......................................
....................................
................................
.......................	
}

وبنفس الطريقة وضعت تعريفات النافذة كالحجم واسمها في الملف التالي MyWindow.h

#include "MyIncludeFile.h"

const int WindowSize = 650; 
const char WinClassName []= "MyClassDevice Of Peace Of Iron And Device";

HWND hwnd; 
WNDCLASSEX WinClass; 
MSG Msg;

والملف التالي يستخدم المعرفات السابقة لانشاء نافذة واسمه كالتالي MyWindow.cpp

#include "MyWindow.h"


LRESULT CALLBACK WndProc ( HWND hwnd , UINT Msg , WPARAM wParam , LPARAM lParam)
{
	switch(Msg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc ( hwnd , Msg , wParam , lParam );
}
INT WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance, LPSTR lpCmdLine , int nShowCmd )
{
	WinClass.cbClsExtra = 0; 
	WinClass.cbSize = sizeof(WNDCLASSEX);
	WinClass.cbWndExtra = 0; 
	WinClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	WinClass.hCursor = LoadCursor ( NULL , IDC_ARROW );
	WinClass.hIcon = LoadIcon ( NULL , IDI_APPLICATION );
	WinClass.hIconSm =  WinClass.hIcon;
	WinClass.hInstance = hInstance;
	WinClass.lpfnWndProc = WndProc;
	WinClass.lpszClassName = WinClassName;
	WinClass.lpszMenuName = NULL; 
	WinClass.style = 0; 

	RegisterClassEx ( &WinClass );

	hwnd = CreateWindowEx (0 , WinClassName , "MyWindow" , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT,
						   CW_USEDEFAULT , WindowSize , WindowSize , NULL , NULL , hInstance, NULL);

	ShowWindow ( hwnd , SW_SHOW );
	UpdateWindow ( hwnd );

	ZeroMemory (&Msg , sizeof(Msg));
	while ( Msg.message != WM_QUIT );
	{
		if ( PeekMessage ( &Msg ,NULL , 0U , 0U , PM_REMOVE ))
		{
			TranslateMessage ( &Msg);
			DispatchMessage (&Msg);
		}
		else
		{
		}
	}
	UnregisterClass ( WinClassName , WinClass.hInstance );
	return 0; 
}

ملاحظة :

الملفان MyClassDevice.h

&

MyWindow.h

يستخدمان الملف الرأسي التالي MyIncludeFile.h

#include <windows.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma warning ( disable : 4430 )

ممكن مساعدة للربط بين الملفين وذلك بأن أشتق كائن من MyDevice

وأضعه في ملف النافذة لكي أستخدم دواله

كالرندر والكلين اب

تم تعديل هذه المشاركة بواسطة 852147 في 28 يوليو 2008 في 16:07

#2

مرحبا اخي

MyClassDevice
#include"MyIncludeFile.h"

MyWindow
#include"MyIncludeFile.h"

MAIN_APPLICATION
#include"MyClassDevice.h"
#include"MyWindow.h"
llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

لم أفهم ماذا تقصد ممكن تشرح أكثر

#4

حسنا فقط ضّمن الملف MyClassDevice.h لملف MyWindow.cpp

وضّمن الملف MyIncludeFile.h لملف MyClassDevice.h

تم تعديل هذه المشاركة بواسطة time1 في 28 يوليو 2008 في 23:43

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#5

لقد قمت بربط الملفين كما قلت لي وظهر لي الخطأ التالي

Error 1 error LNK2005: "struct HWND__ * hwnd" (?hwnd@@3PAUHWND__@@A) already defined in MyClassDevice.obj MyWindow.obj

Error 2 error LNK2005: "struct IDirect3D9 * Direct3D" (?Direct3D@@3PAUIDirect3D9@@A) already defined in MyClassDevice.obj MyWindow.obj

Error 3 error LNK2005: "struct IDirect3DDevice9 * Device" (?Device@@3PAUIDirect3DDevice9@@A) already defined in MyClassDevice.obj MyWindow.obj

Error 4 fatal error LNK1169: one or more multiply defined symbols found C:\Documents and Settings\XPPRESP3\My Documents\Visual Studio 2005\Projects\MyClassDevice\Debug\MyClassDevice.exe 1

#6

عدل الكود كالتالي:

#include "MyIncludeFile.h"

const int WindowSize = 650;
const char WinClassName []= "MyClassDevice Of Peace Of Iron And Device";

extern HWND hwnd;
extern WNDCLASSEX WinClass;
extern MSG Msg;

#include "MyWindow.h"
HWND hwnd;
WNDCLASSEX WinClass;
MSG Msg;
LRESULT CALLBACK WndProc ( HWND hwnd , UINT Msg , WPARAM wParam , LPARAM lParam)
{
    switch(Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc ( hwnd , Msg , wParam , lParam );
}
INT WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance, LPSTR lpCmdLine , int nShowCmd )
{
    WinClass.cbClsExtra = 0;
    WinClass.cbSize = sizeof(WNDCLASSEX);
    WinClass.cbWndExtra = 0;
    WinClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    WinClass.hCursor = LoadCursor ( NULL , IDC_ARROW );
    WinClass.hIcon = LoadIcon ( NULL , IDI_APPLICATION );
    WinClass.hIconSm =  WinClass.hIcon;
    WinClass.hInstance = hInstance;
    WinClass.lpfnWndProc = WndProc;
    WinClass.lpszClassName = WinClassName;
    WinClass.lpszMenuName = NULL;
    WinClass.style = 0;
    RegisterClassEx ( &WinClass );

    hwnd = CreateWindowEx (0 , WinClassName , "MyWindow" , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT,
                           CW_USEDEFAULT , WindowSize , WindowSize , NULL , NULL , hInstance, NULL);

    ShowWindow ( hwnd , SW_SHOW );
    UpdateWindow ( hwnd );

    ZeroMemory (&Msg , sizeof(Msg));
    while ( Msg.message != WM_QUIT );
    {
        if ( PeekMessage ( &Msg ,NULL , 0U , 0U , PM_REMOVE ))
        {
            TranslateMessage ( &Msg);
            DispatchMessage (&Msg);
        }
        else
        {
        }
    }
    UnregisterClass ( WinClassName , WinClass.hInstance );
    return 0;
}

هل بقيت الاخطاء كماهي ؟

tvquran_6.gif

#7

نعم لا زالت الأخطاء كما هي

الرجاء المساعدة

#8

جربت الكود لدي يعمل فقط أضفت :

#include"MyIncludeFile.h"

الي ملف MyClassDevice.h

tvquran_6.gif

#9

سأحاول واجيبك حالا

سأرفقك لك المشروع في الرد القادم

#10

الم يعمل؟ عمل على vc2008 لدي.

tvquran_6.gif

#11

هذا هو المشروع أرجو ألا تبخل علي بأي مساعدة ممكنة

وشكرا أخي على مجهودك لم أشكرك منذ مدة :lol: :lol:

ملا حظة

أنا أستخدم visual studio 2005 pro

MyClassDevice.rar

#12

ايضا لديك في الملف MyWindows.cpp

أضف السطر

#include"MyClassDevice.h"
tvquran_6.gif

#13

مكتبة d3dx9 ليست لدي .

مشاركة 12 هل اضفت السطر . يحتاج الكود اليه.

tvquran_6.gif

#14

لاتزال المشكلة قائمة وهاهي الصور تظهر ذلك

ممكن خطأ في الاعدادات

نعم أضفت السطر لديه

Desktop.rar

#15

اخي في الملف الرئيسي MyWindow ضّمن الملفات التاليه

#include "MyWindow.h"
#include "MyIncludeFile.h"
#include "MyClassDevice.h"

تأكد من تضمين مايلي :

winmm.lib & d3d9.lib & d3dx9.lib

وهناك اخطاء في الكود , راجع الكود .

تم تعديل هذه المشاركة بواسطة time1 في 29 يوليو 2008 في 14:54

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#16

هل تقصد Mywindow.cpp or MyWindow.h

أخي لقد أرفقت المشروع كاملا ممكن تدلني على مكان الخطأ

فأنا راجعت الكود ولاأزال أراجعه

#17

Mywindow.cpp

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#18

لقد ضمنت الكتبات winmm.lib & d3d9.lib & d3dx9.lib

ولا يزال نفس الخطأ

لقد ضمنت الملفات في MyWindow.cpp

ومازال نفس الخطأ

#19

حسنا اخي , راجعت الكود

قم بالتالي :

داخل الملف MyWindow.h ضمن الملف

 #include "MyClassDevice.h"

داخل الملف MyClassDevice.h ضمن الملف

#include "MyIncludeFile.h"

داخل الملفMyClassDevice.cpp ضمن الملف

#include "MyClassDevice.h"

داخل الملف MyWindow.cpp ضمن الملفات

#include "MyWindow.h"
#include "MyClassDevice.h"

اما باقي الاخطاء فهي بالكود نفسه , لاحظ مثلا هناك خطأين في ملف MyIncludeFile.h

	Direct3D 
	Device

ماهذا ؟ :blush:

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#20

help!!!!!

#21

لقد وجدت الحل

سجلت في msdn forum وطرحت المشكلة وأجابوني

وهذا هو رابط الحل

http://forums.msdn.microsoft.com/en-US/vcg...5-eeefc755c0c6/

لاأعرف كيف أشكركم شكرا أخي time1

والاخ فهد لاشلوي الله يعاونكم

لكن هنالك مشكلة أخرى ليس بدرجة الأولة ظهرت بعض التحذيرات

مثل

Warning 5 warning LNK4006: "struct IDirect3D9 * Direct3D" (?Direct3D@@3PAUIDirect3D9@@A) already defined in MyClassDevice.obj; second definition ignored MyWindow.obj

هل هي مؤذية

وكذلك مشكلة أخرى الدوال في الكلاس لاتعمل

في MyWindow.cpp

#22

لو انك اتبعت طريقتي ايضا لتفاديت الاخطاء جميعها :blush:

لكن مازلت اقول لك بأنني لا اعرف لماذا تقوم بكتابة الكود بهذه الطريقة ؟! !

اقصد يفضل لو انك عملت هكذا

ملف واحد وكتبت به الـ D3DPRESENT_PARAMETERS و WinClass مع بعضهم.

ملف يحتوي على تعريف الـ Device و الدوال الاخرى التي تحتاجها بالرسم .

ملف البرنامج الرئيسي .

عندها ستتفادى اخطاء كثيرة , اهمها التعريف المتكرر للمتغيرات .

عموما مبروك حل المشكلة , وتعال خلينا نشوفك معنا بالقسم ( DirectX ) :blush:

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#23

thanks

مواضيع مشابهة