- ベストアンサー
関数のコピー
以下のようなソースがあります。 していることは、char配列に関数をコピーしています。それを関数ポインタに変換して、実行しています。 自作の場合はできるのですが、 MessageBoxをコピーすると以下(字数の関係上無理でした。)のようにメモリ内容がなっており、そのままコピーしたつもりですが、若干異なっております。 どのようにすればMessageBoxがじっこうできるのか, 教えていただきたく質問しました。 よろしくお願いします。 mb,code3が該当分です。 //ソース #include<stdio.h> #include<memory.h> #include<windows.h> int func(int cnt) { return cnt*10; } int func2(int cnt,int cnt2) { return cnt+cnt2; } char *func3() { return "Hello"; } int main() { int (*fa)(int); //MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaotion,UINT uType); int (*fm)(int,int); int (*mb)(HWND,LPCTSTR,LPCTSTR,UINT); char *(*hl)(void); /*fa=func; printf("%d",fa(5)); getchar(); */ char code[12800]; char code2[12800]; char code3[80000]; char code4[12800]; memset(code,0,12800); memset(code2,0,12800); memset(code3,0,80000); memset(code4,0,12800); memcpy(code,(char *)func,12800); memcpy(code2,(char *)func2,12800); memcpy(code3,(char *)MessageBox,80000); memcpy(code4,(char *)func3,12800); fa=(int(*)(int))(void *)code; fm=(int(*)(int,int))(void *)code2; mb=(int(*)(HWND,LPCTSTR,LPCTSTR,UINT))(void *)code3; hl=(char *(*)(void))(void *)code4; printf("%d\n",fa(3)); printf("%d\n",fm(3000,10)); printf(hl()); MessageBox(NULL,"","",MB_OK); mb(NULL,"","",MB_OK); getchar(); return 0; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
理由はいくつか考えられますが、一番可能性が高いのは、コーリングコンベンションが間違っていることではないでしょうか?
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
一体何をしたいんだろう....
お礼
特別理由はないです。 ただ以下のようにできることが嬉しいだけです。 #include<stdio.h> #include<memory.h> #include<windows.h> int func(int cnt) { return cnt*10; } int func2(int cnt,int cnt2) { return cnt+cnt2; } char *func3() { return "Hello"; } int main() { char *(*hl)(void); char code4[12800]; int *pcode; pcode=(int *)code4; memset(code4,0,12800); memcpy(code4,(char *)func3,12800); pcode[1]=(int)"Good Bye~~~~~!"; hl=(char *(*)(void))(void *)code4; pcode[1]=(int)"01234567890"; printf(hl()); getchar(); return 0; }
補足
>>一体何をしたいんだろう.... なにか目的がないといけないのでしょうか? C言語の質問をしただけすが。 こういうことができて、ああいうこともできればC言語の魅力だと思いますが。
お礼
回答ありがとうございます。 わかる限りのことをしてみましたが、 理解できない部分が多く、またそのうち理解出来る日が来ることを祈りつつ今回は締め切らせていただきます。 お二方ともありがとうございました。